5

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

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

这段代码工作正常。我使用以下来获得结果:

<TextBlock Text="{DynamicResource CustomerFullNameBinding}"/>

但是,问题是,如果我在我的代码中使用资源CustomerFullNameBinding 20 次(如上图所示),它们都会以一种特定的格式显示名称。(即在 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 ...

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

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

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

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

4

1 回答 1

3

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

  • 创建一个UserControl3 TextBlocks 用于显示名称的 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... -->

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

把事情搞砸的部分是将一个声明MultiBinding为资源。通常,您绑定的MultiBinding每个都有一个TextBlock,以便您可以更改ConverterParameter每个案例。

编辑:我知道您希望能够更改ConverterParameter,但这实际上是不可能的,因为MultiBindingandConverterParameter是一个普通属性而不是 a DependencyProperty,这将是 a DynamicResourceor的目标Binding

于 2009-08-13T14:59:53.947 回答