如何更改CollectionView.Source的绑定?

时间:2011-06-22 15:21:09

标签: c# wpf xaml data-binding collectionview

最初我在XAML中使用了这段代码:

<CollectionViewSource x:Name="cSource">
  <CollectionViewSource.Source>
    <Binding Source="{StaticResource NameOfXmlDataProvider}" XPath="letter"/>
  </CollectionViewSource.Source>
<CollectionViewSource>

但是我想在C#代码中保留一个绑定对象,以便能够动态地改变它的xpath。 目前我有这段代码:

CollectionViewSource viewSource = this.FindResource("cSource") as CollectionViewSource;
Binding binding = new Binding( "Source" );
binding.Source = _xmlDataProvider;
binding.XPath = "/new/path/to/nodes";
BindingOperations.SetBinding( viewSource, CollectionViewSource.SourceProperty, binding );

这会编译并且不会抱怨,但是在调用时它只会导致一个空列表。 我似乎无法在网络上找到相关的例子 - 其中大部分涉及数据提供者,但我想改变绑定。

  • 有人知道如何解决这个问题吗?
  • 或者有更好的方法吗?
  • 也许是从collectionview中检索绑定对象并更改它?

4 个答案:

答案 0 :(得分:2)

不是绑定到XAML(yuk)中的静态资源或动态更改绑定(yukkier),而是绑定到可以更改的内容。

<CollectionViewSource x:Name="cSource">
  <CollectionViewSource.Source>
    <Binding Source="{Binding MyDataProviderProperty}" XPath="{Binding MyDataXPathProperty}"/>
  </CollectionViewSource.Source>
<CollectionViewSource>

如果您不想使用完整的MVVM,一个很好的技巧是,您可以通过简单地命名页面的UserControl元素并使用{{1将页面DataContext绑定到页面的代码隐藏类将datacontext绑定到它(唯一的限制是DataContext绑定也不能在UserControl上(所以将它放在第一个子节点上,如网格):

ElementName

现在,只要您在代码后面通知属性名为MyDataProviderProperty和MyDataXPath,就可以将它们更改为您心中的内容。

答案 1 :(得分:0)

您需要使用collView的SetBinding()方法。应该是collView.SetBinding(CollectionViewSource.SourceProperty, binding)

之类的东西

请查看http://msdn.microsoft.com/en-us/library/ms752347.aspx以获取进一步的参考。

答案 2 :(得分:0)

问题代码的问题是绑定中的Source。有用的是:

 Binding binding = new Binding();

如果构造函数与参数一起使用,则参数设置为绑定的Path。然后从该路径使用绑定的(附加)XPath。所以它试图在XML中找到导致空选择的“Source”。然后xpath处理一组空节点。

因此可以使用代码中的绑定。

答案 3 :(得分:0)

尝试一下:

ICollectionView cSource {get;set;}

在构造函数中:

cSource = new CollectionViewSource{Source = "myDataSource"}.View;

然后,当您需要更改集合视图源时:

cSource = new CollectionViewSource{Source = "newDataSource"}.View;

然后,例如,如果它是一个数据网格,则您将调用:

DG.ItemsSource = cSource;
DG.Items.Refresh();

Datagrid现在将显示更新的源数据。