如何连接WPF DataBindings以便重用?

时间:2015-02-06 17:52:40

标签: c# wpf xaml data-binding

假设您在XAML中有一个数据绑定,它将Apple类型的实例作为输入,并生成类型为Banana的实例。

您要利用的界面需要DataBinding,其职责是从Apple转换为Cherry。显然,这是从BananaCherry的相对简单的转换,因此您决定在XAML中创建第二个数据绑定,执行此Banana到{{1转换。

现在,您可以从A到B和B到C,但是如何连接这两个,以便您可以传入一个能够将Cherry转换为DataBinding的完整Apple Cherry

这不一定能在vanilla WPF中实现,我很乐意编写代码。我不会感到惊讶,例如,它是否需要类似ConcatenatedDataBinding类的类,其中包含一个输入数据绑定列表的新属性。

谢谢!

2 个答案:

答案 0 :(得分:0)

如果想要组合多个数据绑定以实现特定投影,可以使用Xaml中的MultiBinding,它允许绑定许多对象,并通过专用转换器( IMultiValueConverter)提供独特的结果。

否则,如果有一个需要在单个绑定中处理的不同对象列表,则可以使用Composite Collection存储来处理不同类的对象,但只提供单个结果。

答案 1 :(得分:0)

忽略确切的DataContext和属性更改通知,您的说明听起来像是:

public Apple Apple { get; set; }
public Banana Banana { get; set; }
public Cherry Cherry { get; set; }

...

void OnLoad() {

  SetBinding(
    "Banana",
    new Binding("Apple") {
      Converter = (IValueConverter) FindResource("AppleToBananaConverter"),
      Mode = BindingMode.OneWay
    }
  );

  SetBinding(
    "Cherry",
    new Binding("Banana") {
      Converter = (IValueConverter) FindResource("BananaToCherryConverter"),
      Mode = BindingMode.OneWay
    }
  );

}

在这种情况下,我真的认为最简单的答案是创建一个AppleToCherryConverter。您可以将Apple转移到Banana和Banana转换为Cherry转换例程到一个共享位置,供所有三个转换器使用,以便您重新使用代码:

Apple Apple { get; set; }
Cherry Cherry { get; set; }

...

void OnLoad() {

  SetBinding(
    "Cherry",
    new Binding("Apple") {
      Converter = (IValueConverter) FindResource("AppleToCherryConverter"),
      Mode = BindingMode.OneWay
    }
  );

}