2009-08-13 55 views
5

我是wpf和xaml的新手。我通过在这里搜索或在网上搜索找到大多数问题(用其他语言)的解决方案,但这个让我发疯。我在谷歌上搜索了很多并浏览了很多论坛,但似乎这次我遇到了一个真正的挑战!如何在运行时动态更改MultiBinding(或任何其他)资源的ConverterParameter(或任何)属性?

我在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,缩写(有几个,但为了简单起见,我们不考虑它们)

此代码工作正常。我用下面得到的结果:

<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/en-us/library/ms771336.aspx。

标签:WPF XAML静态资源dynamicresource结合

回答

3

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

  • 创建 s用于显示名称的3个部分。
  • 将以上属性添加到名称的部分以作为绑定的目标。
  • 添加属性为模式,其中显示(FirstNameFirstLastNameFirst等)

上述需要对每个名称的片的结合,使一个方式来简化,这将是使上声明为FirstMiddle一个结构类型NameDataUserControl单个属性,和Last属性。然后你仍然可以使用一个单一的MultiBinding到那个属性。所不同的是,你的NameConverter将采取3件,并返回一个新的NameData结构,而不是一个格式化的字符串。

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

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

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

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

这个想法是从数据中分离出格式。

绊倒东西的部分是声明一个MultiBinding作为资源。通常,您将绑定每个TextBlock上的MultiBinding,以便您可以更改每个案例的ConverterParameter

编辑:我知道你想成为能够改变ConverterParameter,但是这不是真的有可能因MultiBindingConverterParameter 1个实例是一个普通的属性,而不是一个DependencyProperty,这将需要为目标的DynamicResourceBinding

+0

非常感谢您的快速回复。 你是真的。 ConverterParameter是一个普通属性,而不是一个DependencyProperty。其实我是WPF的新手,有时我也忘记了基本概念!将用户控件绑定到返回结构而不是字符串的动态资源是一个好主意。我没有真的尝试过,但我确定它会工作!再一次感谢你!!! – mg007 2009-08-14 10:58:00

相关问题