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

mg0*_*007 5 .net wpf xaml binding converter

我是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>
Run Code Online (Sandbox Code Playgroud)

NameConverter类组合名称的各个部分返回全名.返回值基于ConverterParameter的值,该值可以是以下之一:FirstNameFirst,LastNameFirst,OnlyFirstName,OnlyLastName,Initials(还有一些;但为简单起见,我们不考虑它们)

这段代码工作正常.我用以下来得到结果:

<TextBlock Text="{DynamicResource CustomerFullNameBinding}"/>
Run Code Online (Sandbox Code Playgroud)

但是,问题是如果我在我的代码中使用资源CustomerFullNameBinding 20次(如所示abovw),所有这些都将以一种特定格式显示名称.(即在CustomerFullNameBinding的声明中,我设置了ConverterParameter ="LastNameFirst",所以所有20个引用都只会以这种方式显示名称.)

现在我的问题是我可以使它更"通用",以便我可以动态设置ConverterParameter的值吗?即我可以有多个文本块,可以显示不同格式的全名.我知道如果我们创建多个资源是可能的,如下所示:

 <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 ...
Run Code Online (Sandbox Code Playgroud)

但我不想这样,'因为它真的会让我的代码太笨重,最重要的是它会使资源的可重用性概念无效!

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

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

标签:wpf xaml staticresource dynamicresource binding

Joe*_*ant 3

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

  • 创建一个UserControl3TextBlock秒来显示名称的 3 部分。
  • 将属性添加到上面,以便将名称部分作为绑定目标。
  • 添加显示模式的属性(FirstNameFirstLastNameFirst等)

上面的内容需要对名称的每个部分进行绑定,因此一种简化方法是在使用、和属性声明为结构体的UserControl类型上创建单个属性。然后你仍然可以使用该属性的单个。不同之处在于,您将获取这 3 个部分并返回一个新的结构而不是格式化字符串。NameDataFirstMiddleLastMultiBindingNameConverterNameData

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

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

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

<!-- and so on... -->
Run Code Online (Sandbox Code Playgroud)

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

导致问题的部分是将其声明MultiBinding为资源。MultiBinding通常,您绑定的每个项目上都会有一个TextBlock,以便您可以ConverterParameter针对每种情况更改 。

编辑:我知道您希望能够更改ConverterParameter,但这实际上是不可能的,因为MultiBinding和的 1 个实例ConverterParameter是普通属性而不是 a DependencyProperty,而 a 需要成为 aDynamicResource或的目标Binding