我是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等)
上面的代码需要对名称的每个部分进行绑定,因此简化该方法的一种方法是在类型为UserControl
的NameData
的First
上声明为带有Middle
,Last
的结构的单个属性和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
,但是由于ConverterParameter
和DependencyProperty
的1个实例是普通属性而不是DynamicResource
,这实际上是不可能的,这将要求Binding
或的目标。