2014-09-12 2 views
1

У меня есть граница в WPF, которую я пытаюсь включить или отключить на основе двух свойств в viewmodel: ConnectedVisibility и OperatingMode. Этот триггер данных отключает границу, когда для видимости видимости не установлено значение «Видимый». Но это не работает для OperMode. Для OperatingMode, отличного от 0, граница должна быть отключена, но она остается включенной. Похоже, что OperationMode не влияет на изменение своего значения. Даже точки останова, которые я положил в конвертер, не попадают, кроме случаев, когда программа запускается впервые. Связывание выглядит нормально, так как нет проблем, показанных в выводе Debug для этих привязок. Любая помощь приветствуется.WPF Enable Disable Border на основе 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> 

свойства, к которым его является

public Visibility ConnectedVisibility 
{ 
    get { return connectedVisibility; } 
    set 
    { 
     if (connectedVisibility == value) return; 
     connectedVisibility = value; 
     RaisePropertyChanged("ConnectedVisibility"); 
    } 
} 

public short OperatingMode 
{ 
    get { return UnitOperatingModeVM.OperatingMode; } 
    set 
    { 
     UnitOperatingModeVM.OperatingMode = value; 
    } 
} 

ответ

1

, поскольку у вас есть только одно условие для того, чтобы то же самое, так что, возможно, установив IsEnabled в значение 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> 

Я добавил <Setter Property="IsEnabled" Value="False"/> в стиле, который будет по умолчанию отключить контроль, и я удалили другие избыточные условия

так, как результат, когда оба условия в MultiDataTrigger встретится это позволит тому же, в противном случае он остается заблокированным

выше примера предполагает, что оба свойства в MultiDataTrigger ConnectedVisibility & OperatingMode сообщают об изменениях.


вам может понадобиться добавить уведомление для OperatingMode для того, чтобы MultiDataTrigger огня триггера

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

Спасибо за ответ. Теперь стиль всегда остается отключенным, даже если оба условия выполнены, стиль по-прежнему отключен. Может быть, потому, что сеттер всегда срабатывает, и MultiDataTrigger вообще не срабатывает. –

+0

похоже, что вам нужно добавить 'RaisePropertyChanged (« OperatingMode »);' в 'PropertyMode'. как упоминалось, MultiDataTrigger будет срабатывать только тогда, когда свойство уведомляет изменения и имеет правильное значение. поэтому добавьте RaisePropertyChanged в OperationMode, и это должно быть хорошо. – pushpraj

0

ли RaisePropertyChanged вашего OperatingMode набор свойств вызова реализации («OperatingMode»);

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

    } 
}