多值单数据触发WPF [英] Multiple values single data trigger WPF

查看:38
本文介绍了多值单数据触发WPF的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下代码.

                <Button.Style>
                    <Style BasedOn="{StaticResource {x:Static ToolBar.ButtonStyleKey}}"
                           TargetType="{x:Type Button}">
                        <Setter Property="Visibility" Value="Collapsed" />
                        <Style.Triggers>

                            <DataTrigger Binding="{Binding Status, Mode=OneWay}"
                                         Value="{x:Static comm:DeviceStatus.Standby}">
                                <Setter Property="Visibility" Value="Visible" />
                            </DataTrigger>

                            <DataTrigger Binding="{Binding Status, Mode=OneWay}"
                                         Value="{x:Static comm:DeviceStatus.Busy}">
                                <Setter Property="Visibility" Value="Visible" />
                            </DataTrigger>

                            <DataTrigger Binding="{Binding Status, Mode=OneWay}"
                                         Value="{x:Static comm:DeviceStatus.Offline}">
                                <Setter Property="Visibility" Value="Visible" />
                            </DataTrigger>

                            <DataTrigger Binding="{Binding Status, Mode=OneWay}"
                                         Value="{x:Static comm:DeviceStatus.StartingStream}">
                                <Setter Property="Visibility" Value="Visible" />
                            </DataTrigger>

                            <DataTrigger Binding="{Binding Status, Mode=OneWay}"
                                         Value="{x:Static comm:DeviceStatus.Connecting}">
                                <Setter Property="Visibility" Value="Visible" />
                            </DataTrigger>

                            <DataTrigger Binding="{Binding Status, Mode=OneWay}"
                                         Value="{x:Static comm:DeviceStatus.Disconnecting}">
                                <Setter Property="Visibility" Value="Visible" />
                            </DataTrigger>

                            <DataTrigger Binding="{Binding Status, Mode=OneWay}"
                                         Value="{x:Static comm:DeviceStatus.DownloadingFiles}">
                                <Setter Property="Visibility" Value="Visible" />
                            </DataTrigger>

                        </Style.Triggers>
                    </Style>
                </Button.Style>

默认情况下,该按钮是隐藏的,并且当视图模型中的一个属性中只有几个值时可见.该属性是一个名为DeviceStatus的枚举类型.

The button is hidden by default and is visible when a property in the viewmodel has one out of a few values. The property is of an enum type called DeviceStatus.

基本上,它对提供的触发器执行或"运算.因此,按钮的可见性取决于:状态== StandBy ||状态==忙||...

Basically it conducts an OR operation on the provided triggers. So, the visibility of the button is determined by: Status == StandBy || Status == Busy || ...

如何在没有8个触发器的情况下实现此目的?

How can I implement this without having to have 8 triggers?

我想要以下内容:

<DataTrigger Binding="{Binding Status, Mode=OneWay}">
    <DataTrigger.AnyValue>
        <AnyValueItem Value="{x:Static comm:DeviceStatus.Standby}" />
        <AnyValueItem Value="{x:Static comm:DeviceStatus.Busy}" />
        <AnyValueItem Value="{x:Static comm:DeviceStatus.Offline}" />
        ...
    </DataTrigger.AnyValue>
    <Setter Property="Visibility" Value="Visible" />
</DataTrigger>

如果绑定获得任何提供的值,则将按钮的可见性"设置为可见".谢谢!

Where the Visibility of the Button is set to Visible if the binding gets ANY of the supplied values. Thanks!

推荐答案

阅读答案后,我有了一些想法,找到了令人满意的可扩展解决方案.

After reading the answers I got some ideas and found a satisfying extendable solution.

首先,我创建了以下转换器.

First I created the following converter.

public sealed class EnumOrConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {

        DeviceStatus status = (DeviceStatus)value;

        DeviceStatus[] statuses = parameter as DeviceStatus[];

        if (statuses.Any(s => s == status))
        {
            return Visibility.Visible;
        }
        else
        {
            return Visibility.Collapsed;
        }
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

第二,我只是将以下代码添加到XAML中.

Second I simply added the following code to the XAML.

<Button Command="{Binding SomeCommand}">
    <Button.Style>
        <Style BasedOn="{StaticResource {x:Static ToolBar.ButtonStyleKey}}"
                           TargetType="{x:Type Button}">
            <Setter Property="Visibility">
                <Setter.Value>
                    <Binding Path="Status" Converter="{StaticResource EnumOrConverter}">
                        <Binding.ConverterParameter>
                            <x:Array Type="{x:Type comm:DeviceStatus}">
                                <x:Static Member="comm:DeviceStatus.Standby" />
                                <x:Static Member="comm:DeviceStatus.Busy" />
                                <x:Static Member="comm:DeviceStatus.Offline" />
                                <x:Static Member="comm:DeviceStatus.StartingStream" />
                                <x:Static Member="comm:DeviceStatus.Connecting" />
                                <x:Static Member="comm:DeviceStatus.Disconnecting" />
                                <x:Static Member="comm:DeviceStatus.DownloadingFiles" />
                            </x:Array>
                        </Binding.ConverterParameter>
                    </Binding>
                </Setter.Value>
            </Setter>
        </Style>
    </Button.Style>
</Button>

这使我可以将转换器逻辑重用于许多其他按钮,而无需向ViewModel添加变量或属性.同样发生的是,转换器封装了或:给"参数和默认为Visibility.Collapsed"的逻辑.而且,添加新参数只需要XAML中的一行代码即可.

This allows me to reuse the converter logic for many other buttons and no adding of variables or properties to the ViewModel. What also happened is that the converter encapsulates the logic of "OR:ing" the parameters and "defaulting to Visibility.Collapsed". And adding a new parameter simply requires one line of code in XAML which is where it belongs.

这篇关于多值单数据触发WPF的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆