WPF MultiDataTrigger AND 条件
Posted
技术标签:
【中文标题】WPF MultiDataTrigger AND 条件【英文标题】:WPF MultiDataTrigger AND condition 【发布时间】:2015-11-06 01:46:53 【问题描述】:我只想在我的两个数据网格都选择项目时启用按钮。现在,当任何一个数据网格有选择时,它就会启用。有什么想法吗?
<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>
【问题讨论】:
也许你应该尝试使用 wpf 命令。 【参考方案1】:您的代码会发生以下情况: 当任何一个数据网格都有选择时,两个条件都不是正确的,而是仅当两个数据网格都没有选择时才满足条件。
程序启动时,两个数据网格都为空,因此满足您的条件。现在,如果您在任一网格中进行选择,则永远不会满足您的条件,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>
【讨论】:
【参考方案2】:我相信正确的方法是使用属性绑定和绑定到按钮的具有 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:此代码无效,但您可以找到如何在 SO 上使用 RelayCommand。请在 SO 上搜索一些 RelayCommand 实现。
【讨论】:
以上是关于WPF MultiDataTrigger AND 条件的主要内容,如果未能解决你的问题,请参考以下文章