多值单数据触发WPF

2023-11-29

我有以下代码。

                <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 的枚举类型。

基本上它对提供的触发器进行“或”运算。 因此,按钮的可见性由以下因素决定: Status == StandBy ||状态==忙碌|| ...

如何在不需要 8 个触发器的情况下实现这一点?

我想要如下的东西:

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

如果绑定获取任何提供的值,则按钮的可见性设置为可见。 谢谢!


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

首先我创建了以下转换器。

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

<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 添加变量或属性。还发生的情况是,转换器封装了“OR:ing”参数和“默认为 Visibility.Collapsed”的逻辑。添加新参数只需要 XAML 中的一行代码,这就是它所属的位置。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

多值单数据触发WPF 的相关文章

  • Keyboard.Focus(item) 和 item.Focus() 有什么区别?

    在 WPF 中 有两种方法将焦点设置到元素 您可以调用输入元素的 Focus 方法 也可以使用输入元素作为参数调用 Keyboard Focus first way item Focus alternate way Keyboard Foc
  • 通过用于 Symbol 条码扫描仪 DS4208 的 SNAPI.dll API 捕获图像

    我想通过 SNAPI API 从 Symbol 目前为 Zebra 条形码扫描仪 DS4208 型号 我们还使用 Zebra 的另一个但兼容的型号 捕获图像 条形码捕获 识别效果很好 但看起来像SnapiDLL SNAPI SnapShot
  • 试图使用加密来混淆我的项目打破了它

    我试图尝试不同的混淆选项 为了做到这一点 我首先尝试了加密货币 以下是我遵循的步骤 打开加密向导并选择一些选项 选择我的解决方案文件 完成向导后 我看到有些 Dll 被很好地混淆了 但我的项目现在无法构建 我注意到的两件事是 我的文件夹中有
  • 从套接字读取 C HTTP

    我想知道如何判断是否已从套接字接收到所有数据 这是一个简单的网络代理 现在我正在处理请求部分 所以发送的内容应该以 r n r n 结尾 我不知道请求会持续多久 我在这里读过一些帖子 说我应该检查读取函数是否返回 0 但其他人说0只在客户端
  • xampp openssl 调用 openssl_pkey_new() 时出错;

    所以我试图让 openssl 在我的 Windows 安装的 xampp 1 7 3 上工作 它是用 OpenSSL 0 9 8l 构建的 这只是我第二次在 amp 安装上安装 openssl 但第一次进展顺利 这是在同一台机器上的 wam
  • 如何在Azure功能中添加razor视图文件?

    我正在创建一个应用程序 它是 azure 函数项目 我想在该项目中使用 Razor 视图 我应该在 azure 函数中使用任何模板引擎吗 得益于一些方面的进步剃刀之光项目 https github com toddams RazorLigh
  • ASP.NET中如何访问除wwwroot以外的位置

    我可以使用访问服务器的物理位置Server MapPath 这给了我内部的物理路径wwwroot文件夹 我想将一些数据保存到同一服务器的另一个驱动器中D 驾驶 我想我无法获取以下位置的物理位置D 驾驶使用Server MapPath因为它位
  • 从具有不同活动 perl 版本的另一个 perl 脚本调用 perl 函数

    我们有两个版本的 Active perl 5 6 和 5 24 我们有必须在 Active perl 5 24 版本 采用 TLS 1 2 版本 上执行的 Web 服务 并且需要从 Active perl 5 6 版本调用 我们使用的是wi
  • Identity Server 4:添加访问令牌的声明

    我正在使用 Identity Server 4 和隐式流 并且想要向访问令牌添加一些声明 新的声明或属性是 tenantId 和 langId 我已将 langId 添加为我的范围之一 如下所示 然后通过身份服务器请求 但我也获得了tena
  • 我可以在 C++ 中重写非虚函数吗

    我想知道我可以重写 C 中的非虚函数吗 因为我在使用 C 时发现了这个问题override关键字我的代码如下 class A public void say cout lt lt From A n class B public A publ
  • C++中最大化窗口时的问题

    我的程序需要任意最大化当前桌面上的任何窗口 我通过调用来实现这一点ShowWindow hWnd SW MAXIMIZE 其中 hWnd 是HWND我想要最大化的窗口 当该行代码执行时 相关窗口 此处为记事本 如下所示 一切看起来都很好 除
  • 除空字符串外的任何内容的正则表达式

    是否可以使用正则表达式来检测任何不是 空字符串 的内容 如下所示 string s1 string s2 string s3 string s4 etc 我知道我可以使用修剪等 但我想使用正则表达式 s 将匹配任何包含至少一个非空格字符的字
  • 从视图模型调用方法的命令

    好吧 我倾向于避免使用命令 因为它们总是让我感到困惑 但我正在进行一个新项目 并且正在尝试正确构建它 并且在我看来没有任何代码隐藏 基本上我现在想做的就是连接一个按钮来触发一个命令 在我的视图模型上执行一些操作 但不知何故 如此简单的事情仍
  • 类型别名和不完整类型

    我可能已经超出了解决这个本应简单的问题的范围 我在这里开始这个问题 在编译时获取基类的类型 https stackoverflow com questions 17735852 getting type of a base class at
  • 将 System.Array 从 .Net 编组到 vb6

    我有一个 Net 组件 它有一个 COM 可见类 该类具有返回 System Array 的方法 它实际上返回一个字符串数组 但返回类型声明为 System Array 不要问我 为什么 我知道我可以将返回类型声明为 string 这样就可
  • 用于 nmap 输出的 C++ xml 解析器

    我是 nmap 的新手 我在 nmap 教程中看到 https nmap org book man output html https nmap org book man output html oX 选项可用于获取 xml 格式的 nma
  • 是否可以编写一个在另一个 Windows 应用程序中选择文本时收到通知的 Windows 应用程序?

    我很好奇是否可以编写一个程序来监视我的文本选择 一种可能的用途是编写一个与编辑器 IDE 无关的代码格式化程序 应用程序 服务 P 启动并以某种方式挂接到窗口中 以便在任何窗口中选择文本时收到通知 启动其他一些应用程序 A 用户选择 A 中
  • 使用 MVC5、Ajax、C# 和 MSSQL Server 级联 DropdownList

    我对来自 Windows 窗体和三层架构的 MVC 非常陌生 我试图找出使用从数据库填充的级联下拉列表 DDL 我使用 MS SQL Server 2012 VS 2013 目前我正在研究用户调查问卷 用户可以从 DDL 的多个答案中进行选
  • asp.net mvc GET 请求上的 formcollection 应该为空

    我正在发布一个简单的操作 public void Login FormCollection formCollection 即使查询字符串值很少 formcollection Count is 0 是靠行为吗 FormCollection 使
  • 如何使用 Ioc Unity 注入依赖属性

    我有以下课程 public interface IServiceA string MethodA1 public interface IServiceB string MethodB1 public class ServiceA IServ

随机推荐