我有一个类(用于测试目的的代码非常少),其中包含一个静态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
吗?
答案 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。