viewmodel의 두 속성 인 ConnectedVisibility 및 OperatingMode를 기반으로 사용하거나 사용하지 않도록 설정하려는 WPF 테두리가 있습니다. 이 데이터 트리거는 연결 가시성이 "표시 가능"으로 설정되지 않은 경우 경계를 비활성화합니다. 하지만 OperatingMode에서는 작동하지 않습니다. 0이 아닌 OperatingMode의 경우 경계를 비활성화해야하지만 활성화 된 상태로 유지됩니다. OperatingMode가 값을 전혀 변경하지 않아도 영향을받지 않는 것 같습니다. 변환기에 넣은 중단 점조차 프로그램이 처음 시작될 때를 제외하고는 맞지 않습니다. 이러한 바인딩에 대한 디버그 출력에 문제가 없으므로 바인딩이 제대로 표시됩니다. 어떤 도움을 주셔서 감사합니다.WPF MultiDataTrigger가 작동하지 않음에 따라 테두리 비활성화 사용 가능
스타일이
<Style x:Key="EnableOnConnectBorderCorrected" TargetType="{x:Type Border}">
<!--<Setter Property="BorderBrush" Value="#FFDADADA"/>-->
<Setter Property="BorderBrush" Value="Red"/>
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="CornerRadius" Value="2"/>
<Style.Triggers>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding ConnectedVisibility}" Value="Visible"/>
<Condition Binding="{Binding OperatingMode}" Value="0"/>
</MultiDataTrigger.Conditions>
<Setter Property="IsEnabled" Value="True"/>
</MultiDataTrigger>
<DataTrigger Binding="{Binding OperatingMode, Converter={x:Static VM:IsEqualOrGreaterThanSHORTConverter.Instance}, ConverterParameter=1,Mode=TwoWay}" Value="True">
<Setter Property="IsEnabled" Value="False"/>
</DataTrigger>
<DataTrigger Binding="{Binding ConnectedVisibility}" Value="Collapsed">
<Setter Property="IsEnabled" Value="False"/>
</DataTrigger>
</Style.Triggers>
</Style>
스타일에 사용 된 변환기입니다 것은 ->
public class IsEqualOrGreaterThanSHORTConverter : IValueConverter
{
public static readonly IValueConverter Instance = new IsEqualOrGreaterThanSHORTConverter();
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
short iValue = (short)value;
short compareToValue = System.Convert.ToInt16(parameter);
return iValue >= compareToValue;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
이 스타일이 적용되는 XAML은
<Border Name="RebootDash" Grid.Row="2" Grid.Column="1" Style="{StaticResource EnableOnConnectBorderCorrected}" BorderBrush="#FFDADADA" BorderThickness="1" CornerRadius="2" Width="Auto" Margin="0,1,1,0">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Border Grid.Row="2" Background="Wheat"/>
<telerik:RadButton Command="{Binding ResetUnitCommand, Source={StaticResource UnitCommandProvider}}" Style="{StaticResource DashBoardImageButton}">
<Image Grid.Row="0" Source="/Images/UnitManagementImages/IMG_THOR_UNITResetUnit128.png"
ToolTip="{x:Static properties:Resources.Unit_Command_ResetUnit}"
Width="40" Height="40"
Margin="0,5,0,5"
HorizontalAlignment="Center"/>
</telerik:RadButton>
<TextBlock Grid.Row="2" Text="{x:Static properties:Resources.Unit_Command_ResetUnit}" HorizontalAlignment="Center" Margin="5,5,5,5"/>
</Grid>
</Border>
특성에 인을 범위는
0 그래서 아마도 내가 기본적으로 컨트롤을 비활성화하고 내가 할 스타일로<Setter Property="IsEnabled" Value="False"/>
을 추가 한
<Style x:Key="EnableOnConnectBorderCorrected" TargetType="{x:Type Border}">
<!--<Setter Property="BorderBrush" Value="#FFDADADA"/>-->
<Setter Property="BorderBrush" Value="Red"/>
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="CornerRadius" Value="2"/>
<Setter Property="IsEnabled" Value="False"/>
<Style.Triggers>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding ConnectedVisibility}" Value="Visible"/>
<Condition Binding="{Binding OperatingMode}" Value="0"/>
</MultiDataTrigger.Conditions>
<Setter Property="IsEnabled" Value="True"/>
</MultiDataTrigger>
</Style.Triggers>
</Style>
트릭을해야 기본적으로 False로 IsEnabled
설정 같은 수 있도록 하나 개의 조건이 있기 때문에
답변 해 주셔서 감사합니다. 두 가지 조건이 충족 되어도 스타일이 여전히 비활성화되어 있어도 스타일은 항상 비활성화 상태로 유지됩니다. setter가 항상 실행되고 MultiDataTrigger가 전혀 실행되지 않기 때문일 수 있습니다. –
또한'OperatingMode' 속성 설정자에'RaisePropertyChanged ("OperatingMode");를 추가해야하는 것처럼 보입니다. MultiDataTrigger는 등록 정보가 변경 사항을 알리고 올바른 값을 가질 때만 실행됩니다. 그래서 RaisePropertyChanged를 OperatingMode에 추가하면 괜찮을 것입니다. – pushpraj