绑定静态ObservableCollection的问题

时间:2014-03-16 06:51:44

标签: c# wpf data-binding binding

我有一个类(用于测试目的的代码非常少),其中包含一个静态ObservableCollection,它从其他地方填充:

public class TestClass
{
    public static ObservableCollection<int> TestCollection = new ObservableCollection<int>();
}

...以及一个带有ListBox的基本WPF窗口:

<Window x:Class="app.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <ListBox x:Name="list"/>
    </Grid>
</Window>

当我尝试以编程方式绑定时:

list.ItemsSource = Containers.TestClass.TestCollection;

......它运作得很好。但是,当我尝试通过XAML执行绑定时:

<Window x:Class="app.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="clr-namespace:app.Containers"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <d:TestClass x:Key="dataSource"/>
    </Window.Resources>
    <Grid>
        <ListBox x:Name="list" ItemsSource="{Binding Source={StaticResource dataSource}, Path=TestCollection}"/>
    </Grid>
</Window>

......没有显示任何内容。

我也尝试过设置DataContext

<Window.Resources>
    <l:LifeEngine x:Key="dataSource"/>
</Window.Resources>
<Window.DataContext>
    <Binding Source="{StaticResource dataSource}"/>
</Window.DataContext>

...并使用路径...

......并且没有任何内容再次显示。

另外,不确定是否重要,但是当我上课static时,我的XAML代码中出现错误:

  

“TestClass”类型是抽象的,必须包含显式值。

所以,这是不可能的。

知道如何通过XAML绑定ObservableCollection吗?

1 个答案:

答案 0 :(得分:9)

问题是你试图在实例对象上找到静态属性

<ListBox ItemsSource="{Binding Source={StaticResource dataSource},
                               Path=TestCollection}"/>

这里dataSource指向TestClass的一个实例,并且通过将Path绑定到TestCollection,您要求绑定到一个静态的实例属性TestCollection。这就是它无法正常工作的原因。

您必须使用 x:Static 标记扩展名来绑定到静态属性。 (请注意,您没有创建TestClass的任何实例对象

<ListBox ItemsSource="{Binding Source={x:Static d:TestClass.TestCollection}}"/>

另请注意,静态属性绑定一次。如果您在运行时更改实例,而该实例不会反映在UI上。在您的情况下,您正在处理ObservableCollection,因此当您从集合中添加/删除项时,它将在UI上刷新,但如果您重新初始化列表,则更改将不会反映在UI上。如果您想要更新UI,则必须引发StaticPropertyChangedEvent。如有兴趣,请查看我的回答here