2015-08-13 1 views
2

Я бы хотел включить кнопку, только если оба моих двух набора данных выбрали элементы. В настоящее время он включен, когда у любого из наборов данных есть выбор. Есть идеи?WPF MultiDataTrigger AND condition

<Button x:Name="button" Content="Z" Grid.Column="1" Margin="0,240,0,0" VerticalAlignment="Top" FontFamily="Wingdings 3" FontSize="21.333" ToolTip="Set the selected alarm for the selected alarm time"> 
        <Button.Style> 
         <Style TargetType="Button"> 
          <Setter Property="IsEnabled" Value="True" /> 
          <Setter Property="Opacity" Value="1" /> 
          <Style.Triggers> 
           <MultiDataTrigger> 
            <MultiDataTrigger.Conditions> 
             <Condition Binding="{Binding ElementName=alarmProfilesDataGrid, Path=SelectedItem}" Value="{x:Null}"/> 
             <Condition Binding="{Binding ElementName=alarmFilesDataGrid, Path=SelectedItem}" Value="{x:Null}"/> 
            </MultiDataTrigger.Conditions> 
            <MultiDataTrigger.Setters> 
             <Setter Property="IsEnabled" Value="False" /> 
             <Setter Property="Opacity" Value=".5" /> 
             </MultiDataTrigger.Setters> 
           </MultiDataTrigger> 
          </Style.Triggers> 
         </Style> 
        </Button.Style> 
       </Button> 
+0

Возможно, вам стоит попробовать использовать команду wpf. – bakala12

ответ

2

Вот что происходит с вашим кодом: Вместо обоих условий, чтобы быть правдой, когда любой из DataGrids есть выбор, условия только встретились, когда оба DataGrid не имеют выбора.

Когда программа запускается, оба набора данных являются нулями, поэтому ваше условие выполняется. Теперь, если вы делаете выбор в любой из ваших сеток, ваше состояние никогда не выполняется, а значение IsEnabled остается True, то есть исходное значение.

Чтобы исправить эту проблему, вам нужен конвертер:

public class NotNullToBoolConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     bool result = value == null ? false : true; 

     return result; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return value; 
    } 
} 

и

<Style TargetType="Button"> 
    <Setter Property="IsEnabled" Value="False" /> 
    <Setter Property="Opacity" Value=".5" /> 
    <Style.Triggers> 
    <MultiDataTrigger> 
     <MultiDataTrigger.Conditions> 
     <Condition Binding="{Binding ElementName=alarmProfilesDataGrid, Path=SelectedItem, Converter={StaticResource NotNullToBoolConverter}}" Value="True"/> 
     <Condition Binding="{Binding ElementName=alarmFilesDataGrid, Path=SelectedItem, Converter={StaticResource NotNullToBoolConverter}}" Value="True"/> 
     </MultiDataTrigger.Conditions> 
     <MultiDataTrigger.Setters> 
     <Setter Property="IsEnabled" Value="True" /> 
     <Setter Property="Opacity" Value="1" /> 
     </MultiDataTrigger.Setters> 
    </MultiDataTrigger> 
    </Style.Triggers> 
</Style> 
0

Я считаю, что правильный способ сделать это с помощью привязок объектов и команды с условиями CanExecute, который связан к кнопке.

public RelayCommand SaveCommand { get; set; } 

SaveCommand = new RelayCommand(); 
SaveCommand.Action =() => { Save(SelectedObject1,SelectedObject2); }; 
SaveCommand.CanExecute =() => { SelectedObject1 != null && SelectedObject2 != null) }; 

XAML:

<DataGrid SelectedItem="{Binding Path=SelectedObject1}"> 
</DataGrid> 
<DataGrid SelectedItem="{Binding Path=SelectedObject2}"> 
</DataGrid> 
<Button Context="Save" Command="{Binding SaveCommand}/> 

Это позволит кнопку только тогда, когда два объекта выбран из каждой сетки.

PS: Этот код недействителен, но вы можете найти, как использовать RelayCommand на SO. Пожалуйста, найдите некоторую реализацию RelayCommand на SO.