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
为了能够更改每个实例上使用的显示模式,我想我会这样做:
UserControl3TextBlock秒来显示名称的 3 部分。上面的内容需要对名称的每个部分进行绑定,因此一种简化方法是在使用、和属性声明为结构体的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。