2014-09-12 1 views
1

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 설정 같은 수 있도록 하나 개의 조건이 있기 때문에

답변

1

, 그렇지 않으면 위의 예

비활성 상태를 유지, 다른 중복 조건

MultiDataTrigger의 두 조건이 모두가 동일한있게 충족 결과로 그렇게

을 제거한 MultiDataTrigger의 두 속성 모두 ConnectedVisibility & OperatingMode이 변경 사항을 알리는 것으로 가정합니다.


당신은 또한 MultiDataTrigger 트리거를 발생하기 위해 OperatingMode에 대한 통지를 추가해야 할 수 있습니다

public short OperatingMode 
{ 
    get { return UnitOperatingModeVM.OperatingMode; } 
    set 
    { 
     UnitOperatingModeVM.OperatingMode = value; 
     RaisePropertyChanged("OperatingMode"); 
    } 
} 
+0

답변 해 주셔서 감사합니다. 두 가지 조건이 충족 되어도 스타일이 여전히 비활성화되어 있어도 스타일은 항상 비활성화 상태로 유지됩니다. setter가 항상 실행되고 MultiDataTrigger가 전혀 실행되지 않기 때문일 수 있습니다. –

+0

또한'OperatingMode' 속성 설정자에'RaisePropertyChanged ("OperatingMode");를 추가해야하는 것처럼 보입니다. MultiDataTrigger는 등록 정보가 변경 사항을 알리고 올바른 값을 가질 때만 실행됩니다. 그래서 RaisePropertyChanged를 OperatingMode에 추가하면 괜찮을 것입니다. – pushpraj

0

는 ("OperatingMode")를 귀하의 OperatingMode 속성 집합 구현 호출이 RaisePropertyChanged이다;

private short operatingMode; 
public short OperatingMode 
{ 
    get 
    { 
     return operatingMode; 
    } 
    set 
    { 
     if (operatingMode != value) 
     { 
      operatingMode = value; 
      this.RaisePropertyChanged("OperatingMode"); 
     } 

    } 
}