首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WPF MultiDataTrigger和条件

WPF MultiDataTrigger和条件
EN

Stack Overflow用户
提问于 2015-08-13 15:44:07
回答 2查看 21.9K关注 0票数 8

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

代码语言:javascript
复制
<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>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-08-13 18:45:54

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

当程序启动时,两个datagrids都为空,因此满足您的条件。现在,如果您在任一网格中进行选择,则永远不会满足您的条件,并且IsEnabled的值仍为True,即原始值。

要解决此问题,您需要一个转换器:

代码语言:javascript
复制
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;
    }
}

代码语言:javascript
复制
<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>
票数 11
EN

Stack Overflow用户

发布于 2015-10-20 17:02:00

我认为正确的方法是使用属性绑定和绑定到按钮的带有CanExecute条件的命令。

代码语言:javascript
复制
public RelayCommand SaveCommand { get; set; }

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

XAML:

代码语言:javascript
复制
<DataGrid SelectedItem="{Binding Path=SelectedObject1}">
</DataGrid>
<DataGrid SelectedItem="{Binding Path=SelectedObject2}">
</DataGrid>
<Button Context="Save" Command="{Binding SaveCommand}/>

这将仅当从每个网格中选择两个对象时启用该按钮。

PS:这段代码是无效的,但是你可以找到如何在SO上使用RelayCommand。请在SO上搜索一些RelayCommand实现。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31982354

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档