gpt4 book ai didi

.net - 如何在运行时动态更改 MultiBinding(或任何其他)资源的 ConverterParameter(或任何)属性?

转载 作者:行者123 更新时间:2023-12-04 21:00:39 25 4
gpt4 key购买 nike

我是 wpf 和 xaml 的新手。我通过在这里搜索或谷歌搜索找到了大多数问题的解决方案(用其他语言),但这让我发疯了。我在谷歌上搜索了很多,浏览了很多论坛,但这次我似乎遇到了真正的挑战!

我在 Window.Resources 中有以下代码:

<my:NameConverter x:Key="NameConverter"/>

<MultiBinding x:Key="CustomerFullNameBinding"
Converter="{StaticResource NameConverter}"
ConverterParameter="LastNameFirst">
<Binding Path="FirstName" />
<Binding Path="MiddleName" />
<Binding Path="LastName" />
</MultiBinding>

名称转换器 类通过组合名称的各个部分来返回全名。返回值基于 的值转换器参数 可以是以下之一:FirstNameFirst、LastNameFirst、OnlyFirstName、OnlyLastName、Initials(还有一些;但为简单起见,我们不考虑它们)

这段代码工作正常。我使用以下来获得结果:
<TextBlock Text="{DynamicResource CustomerFullNameBinding}"/>

但是,问题是如果我使用资源 客户全名绑定(bind) 在我的代码中出现了 20 次(如上图所示),它们都会以一种特定的格式显示名称。 (即在 CustomerFullNameBinding 的声明中,我设置了 ConverterParameter="LastNameFirst"所以所有 20 个引用都将仅以这种方式显示名称。)

现在我的问题是我可以让它更“通用”,以便我可以动态设置 ConverterParameter 的值吗? 即我可以有多个可以以不同格式显示全名的文本 block 。我知道如果我们创建多个资源,如下所示:
 <MultiBinding x:Key="CustomerFullNameBinding_FirstNameFirst" 
Converter="..." ConverterParameter="FirstNameFirst">
......
</MultiBinding>
<MultiBinding x:Key="CustomerFullNameBinding_LastNameFirst"
Converter="..." ConverterParameter="LastNameFirst">
......
</MultiBinding>
<MultiBinding x:Key="CustomerFullNameBinding_OnlyFirstName"
Converter="..." ConverterParameter="OnlyFirstName">
......
</MultiBinding>

... and so on ...

但我不希望这样,'因为它真的会使我的代码过于庞大,最重要的是它会使资源可重用性的概念无效!

请建议我任何可能的解决方案。
提前致谢。

注:我从 here 得到了最初的想法.可以在 msdn.microsoft.com/en-us/library/ms771336.aspx 找到类似的工作示例。

标签: wpf xaml 静态资源 动态资源绑定(bind)

最佳答案

为了能够更改每个实例上使用的显示模式,我想我会这样做:

  • 创建 UserControl与 3 TextBlock s 用于显示名称的 3 个部分。
  • 将属性添加到上面的名称部分作为绑定(bind)目标。
  • 添加显示模式的属性(FirstNameFirst、LastNameFirst 等)

  • 上面需要对名称的每个部分进行绑定(bind),因此简化的一种方法是在 UserControl 上创建一个属性。类型 NameDataFirst 声明为结构, Middle , 和 Last特性。然后你仍然可以使用单个 MultiBinding到那个属性。不同之处在于您的 NameConverter将取 3 件并返回一个新的 NameData struct 而不是格式化的字符串。
    <NameTextBlock NameData="{DynamicResource CustomerFullNameBinding}" NameDisplayMode="LastNameFirst" />

    <NameTextBlock NameData="{DynamicResource CustomerFullNameBinding}" NameDisplayMode="FirstNameFirst" />

    <NameTextBlock NameData="{DynamicResource CustomerFullNameBinding}" NameDisplayMode="Initials" />

    <!-- and so on... -->

    这个想法是将格式与数据分离。

    出错的部分是声明一个 MultiBinding作为资源。通常会有 MultiBinding在每个 TextBlock您正在绑定(bind),以便您可以更改 ConverterParameter对于每个案例。

    编辑:我知道你希望能够改变 ConverterParameter ,但由于 MultiBinding 的 1 个实例,这实际上是不可能的和 ConverterParameter是普通属性(property)而不是 DependencyProperty ,它必须是 DynamicResource 的目标或 Binding .

    关于.net - 如何在运行时动态更改 MultiBinding(或任何其他)资源的 ConverterParameter(或任何)属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1272049/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com