c# - WPF MultiDataTrigger AND 条件

标签 c# wpf datagrid multidatatrigger

我只想在我的两个数据网格都选择了项目时才启用按钮。现在,当其中一个数据网格有选择时,它就会被启用。有什么想法吗?

<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>

最佳答案

这是您的代码发生的情况: 当其中一个数据网格有选择时,不是两个条件都为真,而是只有当两个数据网格都没有选择时才满足条件。

当程序启动时,两个数据网格都为空,因此满足您的条件。现在,如果您在任一网格中进行选择,您的条件将永远不会满足,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>

关于c# - WPF MultiDataTrigger AND 条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31982354/

相关文章:

c# - ToString() 在字符串上使用时会产生新字符串吗?

wpf - WPF DataGrid 单元格的条件格式取决于数据类型

c# - 如何从 WPF 中的基类型集合中为子类型集合自动生成 DataGrid 列?

c# - 在 Windows 8 Metro 应用程序中管理自动旋转

c# - 如何以编程方式设置 DataGridView 中的单元格值?

c# - 将属性装饰器添加到部分类

wpf - 如果用户输入了无效的电子邮件地址,则禁用按钮 - WPF

wpf - 程序员编辑 XAML 的最佳方式

c - WPF 中的 SelectedRow 和 DataBoundItem 是如何获取的?

.net - 对一个 DataGridView 列使用两个不同 DataRow.Columns 的值