带有 MarkupExtension 的 IValueConverter

2023-12-30

最近我读到一篇关于IValueConverter它也继承自MarkupExtension。它是这样的:

internal class BoolToVisibilityConverter : MarkupExtension, IValueConverter
{
    private static BoolToVisibilityConverter converter;
    public BoolToVisibilityConverter()
    {
    }
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value is bool)
        {
            if ((bool)value)
            {
                return Visibility.Visible;
            }
        }
        return Visibility.Collapsed;
    }
    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value is Visibility)
        {
            Visibility visibility = (Visibility)value;
            if (visibility == Visibility.Collapsed)
            {
                return false;
            }
        }
        return true;
    }
    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        return converter ?? (converter = new BoolToVisibilityConverter());
    }
}

用法看起来像:

<Button Content="Delete" Visibility="{Binding CanDelete, UpdateSourceTrigger=PropertyChanged, Converter={local:BoolToVisibilityConverter}"/>

我习惯于使用来自资源的转换器,例如:

<loc:BoolToVisibilityConverter x:Key="BoolToVisibilityConverter"/>
...
<Button Content="Delete" Visibility="{Binding CanDelete, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource BoolToVisibilityConverter}"/>

我现在的第一个问题是:更好的方法是什么?如果我使用的话,它有什么优势MarkupExtension-Version(除了用法更容易打字)?

我还看到了一个非常相似的实现,如下所示:

internal class BoolToVisibilityConverter : MarkupExtension, IValueConverter
{
    public BoolToVisibilityConverter()
    {
    }
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value is bool)
        {
            if ((bool)value)
            {
                return Visibility.Visible;
            }
        }
        return Visibility.Collapsed;
    }
    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value is Visibility)
        {
            Visibility visibility = (Visibility)value;
            if (visibility == Visibility.Collapsed)
            {
                return false;
            }
        }
        return true;
    }
    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        return this;        
    }
}

如果我理解正确,第一个解决方案仅创建此转换器的一个实例。第二个为每个 XAML 创建该转换器的一个新实例,对吗?


使用的一大优势MarkupExtension我从未见过在线使用的事实是它可以允许您将值传递给转换器,这些值可以用作参数或返回值,例如:

public class CustomNullToVisibilityConverter : MarkupExtension, IValueConverter
{
    public object NullValue { get; set; }
    public object NotNullValue { get; set; }

    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        return this;
    }

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value == null) return NullValue;

        return NotNullValue;
    }

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

Usage:

...
Visibility="{Binding Property, 
            Converter={cnv:CustomNullToVisibilityConverter 
                       NotNullValue=Visible, NullValue=Collapsed}}" />
...

请务必在中引用转换器的命名空间.xaml.


Edit:

我忘记提到的一件事是,是的,您是正确的,因为该方法每次使用时都会创建一个新的转换器实例,这是一个缺点。

但是,没有什么可以阻止您添加转换器MarkupExtension到资源字典 - 这样它只会被实例化一次。就像这样:

<cnv:CustomNullToVisibilityConverter x:Key="NullToVisibilityConverter"
        NotNullValue=Visible, NullValue=Collapsed />
...
Visibility="{Binding Property, Converter={StaticResource NullToVisibilityConverter}" />
...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

带有 MarkupExtension 的 IValueConverter 的相关文章

  • 使用 lambda 表达式注册类型

    我想知道如何在 UnityContainer 中实现这样的功能 container RegisterType
  • 如何在多线程C++ 17程序中交换两个指针?

    我有两个指针 pA 和 pB 它们指向两个大的哈希映射对象 当pB指向的哈希图完全更新后 我想交换pB和pA 在C 17中 如何快速且线程安全地交换它们 原子 我是 c 17 的新手 2个指针的原子无等待交换可以通过以下方式实现 inclu
  • 代码 GetAsyncKeyState(VK_SHIFT) & 0x8000 中的这些数字是什么?它们是必不可少的吗?

    我试图在按下按键的简单动作中找到这些数字及其含义的任何逻辑解释 GetAsyncKeyState VK SHIFT 0x8000 可以使用哪些其他值来代替0x8000它们与按键有什么关系 GetAsyncKeyState 根据文档返回 如果
  • GetType() 在 Type 实例上返回什么?

    我在一些调试过程中遇到了这段代码 private bool HasBaseType Type type out Type baseType Type originalType type GetType baseType GetBaseTyp
  • 查找进程的完整路径

    我已经编写了 C 控制台应用程序 当我启动应用程序时 不使用cmd 我可以看到它列在任务管理器的进程列表中 现在我需要编写另一个应用程序 在其中我需要查找以前的应用程序是否正在运行 我知道应用程序名称和路径 所以我已将管理对象搜索器查询写入
  • 如何填充 ToolStripComboBox?

    我发现它很难将数据绑定到ToolStripComboBox 好像没有这个ValueMember and DisplayMember特性 怎么绑定呢 访问toolstripcombobox中包装的组合框并访问其ValueMember Disp
  • 函数参数的默认参数是否被视为该参数的初始值设定项?

    假设我有这样的函数声明 static const int R 0 static const int I 0 void f const int r R void g int i I 根据 dcl fct default 1 如果在参数声明中指
  • Visual Studio 在构建后显示假错误

    我使用的是 Visual Studio 2017 构建后 sln在调试模式下 我收到错误 但是 当我通过双击错误列表选项卡中的错误来访问错误时 错误会从页面中消失 并且错误数量也会减少 我不太确定这种行为以及为什么会发生这种情况 有超过 2
  • unordered_map 中字符串的 C++ 哈希函数

    看起来 C 标准库中没有字符串的哈希函数 这是真的 在任何 c 编译器上使用字符串作为 unordered map 中的键的工作示例是什么 C STL提供模板专业化 http en cppreference com w cpp string
  • File.AppendText 尝试写入错误的位置

    我有一个 C 控制台应用程序 它作为 Windows 任务计划程序中的计划任务运行 此控制台应用程序写入日志文件 该日志文件在调试模式下运行时会创建并写入应用程序文件夹本身内的文件 但是 当它在任务计划程序中运行时 它会抛出一个错误 指出访
  • 为什么可以通过ref参数修改readonly字段?

    考虑 class Foo private readonly string value public Foo Bar ref value private void Bar ref string value value hello world
  • 启动时的 Excel 加载项

    我正在使用 Visual C 创建 Microsoft Excel 的加载项 当我第一次创建解决方案时 它包含一个名为 ThisAddIn Startup 的函数 我在这个函数中添加了以下代码 private void ThisAddIn
  • 使用valgrind进行GDB远程调试

    如果我使用远程调试gdb我连接到gdbserver using target remote host 2345 如果我使用 valgrind 和 gdb 调试内存错误 以中断无效内存访问 我会使用 target remote vgdb 启动
  • 保护 APK 中的字符串

    我正在使用 Xamarin 的 Mono for Android 开发一个 Android 应用程序 我目前正在努力使用 Google Play API 添加应用内购买功能 为此 我需要从我的应用程序内向 Google 发送公共许可证密钥
  • 实体框架中的“it”是什么

    如果以前有人问过这个问题 请原谅我 但我的任何搜索中都没有出现 它 我有两个数据库表 Person 和 Employee 对每个类型的表进行建模 例如 Employee is a Person 在我的 edmx 设计器中 我定义了一个实体
  • 可访问性不一致:参数类型的可访问性低于方法

    我试图在两个表单之间传递一个对象 基本上是对当前登录用户的引用 目前 我在登录表单中有一些类似的内容 private ACTInterface oActInterface public void button1 Click object s
  • 使用 omp_set_num_threads() 将线程数设置为 2,但 omp_get_num_threads() 返回 1

    我有以下使用 OpenMP 的 C C 代码 int nProcessors omp get max threads if argv 4 NULL printf argv 4 s n argv 4 nProcessors atoi argv
  • 我可以在“字节数”设置为零的情况下调用 memcpy() 和 memmove() 吗?

    当我实际上没有什么可以移动 复制的时候 我是否需要处理这些情况memmove memcpy 作为边缘情况 int numberOfBytes if numberOfBytes 0 memmove dest source numberOfBy
  • 如何减少具有多个单元的 PdfPTable 的内存消耗

    我正在使用 ITextSharp 创建一个 PDF 它由单个 PdfTable 组成 不幸的是 对于特定的数据集 由于创建了大量 PdfPCell 我遇到了内存不足异常 我已经分析了内存使用情况 我有近百万个单元格的 1 2 在这种情况下有
  • 如何使用 C++11 using 语法键入定义函数指针?

    我想写这个 typedef void FunctionPtr using using 我该怎么做呢 它具有类似的语法 只不过您从指针中删除了标识符 using FunctionPtr void 这是一个Example http ideone

随机推荐

  • 使用 gnu asm 在 x64 中使用参数执行

    我正在尝试在 Linux 的 GNU asm 中编写 shellcode 但无法使用参数调用 execve 我正在尝试做什么 execve bin ls bin ls la NULL NULL 这是我的代码 section text glo
  • 在实体存储库中注入容器

    我想获取存储库中的当前区域设置 这就是为什么我将容器注入到我的存储库中 但我收到错误 我无法弄清楚 这是我的service yml code survey repository container aware class Demo Surv
  • webview 遇到重定向问题

    NSURL urlString NSURL URLWithString urlAddress URL Requst Object NSURLRequest requestObj NSURLRequest requestWithURL url
  • Laravel 5.4 artisan 为 /public 处的现有文件夹提供 htaccess / 和 Routes::get 服务

    我仍在尝试使用 Laravel 5 4 然而运行 php artisan server 没有考虑 public中的 htaccess文件 无论我在那里编辑什么 它仍然没有处理它 artisan服务运行在127 0 0 1 8000 我遇到这
  • 将 API 的响应作为节点服务器的响应传递会引发异常

    在某些情况下 当在我的节点 express 服务器上命中特定路由时 我想向 API 发出请求并将该响应直接返回给客户端 我关注了这个堆栈溢出帖子 将服务器端 axios 请求的响应发送到 React Redux 应用程序 https sta
  • 为什么 asp.net mvc 中的部分视图需要下划线

    只是为了区分对话框内使用的视图还是 foreach 循环 客户详细信息 中使用的视图 你不需要下划线 这只是一个约定 而MVC非常热衷于使用约定
  • Ruby on Rails 脚本控制台

    我没能跑 script console以前 它曾经抛出一个错误 因为我script console文件已包含 usr bin env ruby19 进行命中和试验后 我通过替换修复了此错误 usr bin env ruby19 with u
  • 数据声明 Haskell 中的类型约束

    我正在使用 Haskell 并尝试编写以下内容 data Scale s Scale s s 但是 我想做到这一点s必须是 Num 类型类的内容 例如 Int 或 Double 使用 Haskell 和 GHC 可以做到这一点吗 Yes L
  • 正则表达式匹配所有内容,直到最后一次出现 /

    使用正则表达式 Ant 中的 Replaceregexp 如何匹配 然后替换 从行开头到最后一次出现斜杠的所有内容 我需要从以下任何一个开始 replace this keep this replace this replace this
  • 是否存在通过有向图所有顶点的路径?

    给定G 一个有向图 是否存在一条经过G中所有顶点的路径 不一定是简单路径 我首先需要检查非循环图和强连通图中发生的情况 然后使用强连通分量的图找到一般图的解决方案 到目前为止 我已经发现 对于强连通图来说 总有一条路径 对于非循环图 如果有
  • 什么是 premain() 以及如何调用它?

    我从来没有听说过premain我觉得这样问有点愚蠢 但是这篇文章的答案 https stackoverflow com questions 9368764 calculate size of object in java建议运行它以获得In
  • 相对布局的对角溢出背景

    大家好 我想要布局的背景如下 现在我正在做的事情如下
  • Rails 邮件程序 mimepart 在消息正文中显示为文本

    我正在使用 ActionMailer 发送测试邮件 模板正在呈现 邮件正在正常投递 唯一的问题是 Google 在消息正文中显示 mimepart 和其他标头数据 这是邮件的代码 def testing mail to gt email p
  • 字符串排列的时间复杂度

    以下示例取自 破解编码面试 第 6 版 一书 根据本书 以下代码的时间复杂度为 O n 2 n 请参考示例12 第32 33页 public static void main String args new PermutationsTest
  • 学习Python:根据条件更改列表中的值

    抱歉问了这个非常基本的问题 但这实际上是一个由两部分组成的问题 给定一个列表 我需要替换 的值带有 i 和带有整数 10 的 x 列表并不总是具有相同数量的元素 因此我需要一个允许我执行此操作的循环 a 1 7 8 5 x 如何获取值等于
  • 在选项卡中加载不同的活动

    我花了相当长的时间搜索 stackoverflow 和 google 但找不到正确向我解释如何在我的应用程序中实现选项卡的指南 我知道不应该使用 TabActivity 我还阅读了有关不要使用 TabHost 的建议 至少是这样理解的 我的
  • 当我的文本显示为问号时,这意味着什么?

    我正在尝试使用 例如 Windows GDI 在程序中显示一些文本 并且某些 unicode 字符显示为问号 怎么了 也可以看看 当我的文本显示为方框时 这意味着什么 https stackoverflow com questions 21
  • 可变参数模板示例

    考虑下面的代码 我不明白为什么必须定义 print 的空函数 include
  • Windows 转储文件格式

    我一直致力于创建更好的工具来处理我的组织中的转储 对于核心转储 linux 这很简单 因为它们是具有已知格式的 ELF 文件 然而 我们有一些 Windows 系统 它们生成的转储似乎不是 ELF 我知道有 Windows 工具可以处理这些
  • 带有 MarkupExtension 的 IValueConverter

    最近我读到一篇关于IValueConverter它也继承自MarkupExtension 它是这样的 internal class BoolToVisibilityConverter MarkupExtension IValueConver