最初我在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 );
这会编译并且不会抱怨,但是在调用时它只会导致一个空列表。 我似乎无法在网络上找到相关的例子 - 其中大部分涉及数据提供者,但我想改变绑定。
答案 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现在将显示更新的源数据。