DataBinding到全局ObservableCollection

时间:2012-04-26 15:24:17

标签: wpf data-binding mvvm observablecollection

我有一个使用MVVM模式的WPF应用程序,我有很多ObservableCollections。我没有将这些ObservableCollections放入每个ViewModel中,而是将它们放入一个名为Observables的静态类中,该类是静态类AppCommon的成员。所以我可以通过AppCommon.Observables.AnyObservableINeed访问所有可观察的集合。

现在我需要更改UserControl的绑定,以便它们绑定到这些全局的ObservableCollection,但我不知道如何在不改变DataContext的情况下引用这些ObservableCollections。

我尝试添加类似

的命名空间
xmlns:globals="clr-namespace:Demirbaş.Globals"

然后在ListBox中设置ItemsSource属性,如

<ListBox ItemsSource="{Binding Source={globals:Observables.TaşınırSınıfları}}"

但这会给我以下错误:

'{globals:Observables.TaşınırSınıfları}' value is not a valid MarkupExtension expression. Cannot resolve 'Observables.TaşınırSınıfları' in namespace 'clr-namespace:Demirbaş.Globals'. 'Observables.TaşınırSınıfları' must be a subclass of MarkupExtension. 

这是什么问题?我使用正确的XAML语法绑定到这些集合吗?

修改 ItemsSource="{Binding Source={x:Static globals:AppCommon.Observables.TaşınırSınıfları}}"给了我错误:

Cannot find the type 'AppCommon.Observables'. Note that type names are case sensitive.

我认为它不能引用嵌套类,是不是?解决方案是什么?

由于

3 个答案:

答案 0 :(得分:2)

您需要使用x:Static标记扩展名,例如评论中建议的LPL,告诉WPF它是一个静态对象

<ListBox ItemsSource="{Binding 
    Source={x:Static globals:Observables.TaşınırSınıfları}}" />

答案 1 :(得分:2)

我不知道您的应用程序的命名空间,但请尝试

xmlns:local="clr-namespace:Demirbaş"

<ListBox ItemsSource="{Binding 
    Source={x:Static local:AppCommon+Observables.TaşınırSınıfları}}" />

答案 2 :(得分:0)

当命名空间引用未完全限定且目标绑定存在于另一个程序集中时,也会发生此错误。

例如,xmlns:l="clr-namespace:AssemblyA.Namespace;assembly=AssemblyA".

如果未指定特定程序集,将显示相同的错误消息&#34; value不是有效的MarkupExtension表达式&#34;。