我是wpf和xaml的新手。我可以通过在此处搜索或在各处搜索来找到大多数问题的解决方案(使用其他语言),但这使我发疯。我在Google上搜索了很多东西,并浏览了许多论坛,但这次似乎遇到了一个真正的挑战!

我在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次(如显示的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 ...


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

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

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

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

最佳答案

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


用3个UserControl创建一个TextBlock来显示名称的3个部分。
在上面添加属性,以使部分名称成为绑定目标。
为显示模式添加一个属性(FirstNameFirst,LastNameFirst等)


上面的代码需要对名称的每个部分进行绑定,因此简化该方法的一种方法是在类型为UserControlNameDataFirst上声明为带有MiddleLast的结构的单个属性和MultiBinding属性。然后,您仍然可以对该属性使用单个NameConverter。不同之处在于您的NameData将采用3个部分,并返回一个新的MultiBinding结构而不是格式化的字符串。

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

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

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

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


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

使事情崩溃的部分是将一个MultiBinding声明为资源。通常,要绑定到的每个TextBlock上都会有一个ConverterParameter,以便您可以为每种情况更改ConverterParameter

编辑:我知道您希望能够更改MultiBinding,但是由于ConverterParameterDependencyProperty的1个实例是普通属性而不是DynamicResource,这实际上是不可能的,这将要求Binding或的目标。

09-12 07:52