如何将命令的CanExecute值绑定到XAML中的MultiDataTrigger条件?

时间:2015-08-07 14:24:33

标签: c# wpf xaml

请参阅修改3 以获取更新摘要。

我正在开发一个WPF Prism应用程序,其视图具有Grid元素,只有在三个命令中的任何一个返回true时才能看到该元素。现在我已经通过为每个命令创建一个bool属性来工作,它返回是否可以激活,但我不应该这样做,因为它复制了命令可以做的事情。

这是我现在拥有的XAML:

<Grid x:Name="OptionsContainer">
    <Grid.Style>
        <Style>
            <Setter Property="Grid.Visibility" Value="Visible" />
            <Style.Triggers>
                <MultiDataTrigger>
                    <MultiDataTrigger.Conditions>
                        <Condition Binding="{Binding Path=CanSaveUser}" Value="false" />
                        <Condition Binding="{Binding Path=CanUndoAll}" Value="false" />
                        <Condition Binding="{Binding Path=CanDeleteUser}" Value="false" />
                    </MultiDataTrigger.Conditions>
                    <Setter Property="Grid.Visibility" Value="Collapsed" />
                </MultiDataTrigger>
            </Style.Triggers>
        </Style>
    </Grid.Style>

    <!-- Elements nested in this grid go here. -->

</Grid>

这是有效的,但我无法找到将其转换为使用命令的方法。过去两天我一直在寻找并没有遇到我正在寻找的东西,但如果有现有资源,请随时指出我的方向!

编辑:以下是我对Condition的实现看起来像使用命令。对我来说,这是我最好的猜测。

<Condition Binding="{Binding Path=SaveUserCommand, Converter={StaticResource InvCmndToBool}, ConverterParameter=InvertFalse}" Value="false" />

编辑2 :我意识到最好在我编写的第一个编辑中包含我正在调用的转换器。你会在下面找到它。

[ValueConversion(typeof(DelegateCommand<object>), typeof(bool))]
public class InvertableCommandToBoolConverter : IValueConverter
{
    enum Parameters
    {
        InvertFalse, InvertTrue
    }

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        DelegateCommand<object> command = (DelegateCommand<object>)value;
        bool boolValue = command.CanExecute(null);

        var direction = (Parameters)Enum.Parse(typeof(Parameters), (string)parameter);

        if (direction == Parameters.InvertTrue)
            return !boolValue;

        return boolValue;
    }

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

编辑3 :经过一些更多的测试后,我将问题范围缩小到绑定,而不是更新(据我所知)调用相应命令的CanExecuteChanged事件。绑定到在命令的CanExecute(object)方法中更新的bool值会更新MultiDataTrigger,但使用命令则不会。这意味着它在最初创建视图时设置正确的值。不确定是否还需要做其他事情来确保命令被调用?

您可以看到我的第一次编辑,以了解我现在使用的条件示例。

0 个答案:

没有答案