繁体   English   中英

WPF MultiDataTrigger和条件

[英]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>

这就是您的代码所发生的情况:当两个数据网格都具有选择项时,不是两个条件都成立,而是仅当两个数据网格都没有选择项时才满足条件。

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

我相信正确的方法是使用属性绑定和具有CanExecute条件的命令,该命令绑定到Button。

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实现。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM