B.K*_*.K. 4 c# data-binding wpf binding
我有一个类(用于测试目的的代码很少),它包含一个静态的ObservableCollection
,从其他地方填充:
public class TestClass
{
public static ObservableCollection<int> TestCollection = new ObservableCollection<int>();
}
Run Code Online (Sandbox Code Playgroud)
...和一个基本的WPF窗口,其中包含ListBox
:
<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>
Run Code Online (Sandbox Code Playgroud)
当我尝试以编程方式绑定时:
list.ItemsSource = Containers.TestClass.TestCollection;
Run Code Online (Sandbox Code Playgroud)
......工作得很好.但是,当我尝试通过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>
Run Code Online (Sandbox Code Playgroud)
......什么都没有显示出来
我也尝试过设置DataContext
:
<Window.Resources>
<l:LifeEngine x:Key="dataSource"/>
</Window.Resources>
<Window.DataContext>
<Binding Source="{StaticResource dataSource}"/>
</Window.DataContext>
Run Code Online (Sandbox Code Playgroud)
......并使用路径......
......没有任何东西再次显示出来.
另外,不确定它是否重要,但是当我上课时static
,我的XAML代码中出现错误:
类型'TestClass'是抽象的,必须包含显式值.
所以,这是不可能的.
知道如何ObservableCollection
通过XAML 绑定它吗?
问题是您正在尝试在实例对象上查找静态属性.
<ListBox ItemsSource="{Binding Source={StaticResource dataSource},
Path=TestCollection}"/>
Run Code Online (Sandbox Code Playgroud)
这里dataSource指向TestClass的一个实例,并且通过将Path绑定到TestCollection,您要求绑定到一个静态的实例属性TestCollection.这就是为什么它不起作用.
您必须使用x:Static
标记扩展来绑定到静态属性.(注意,您没有创建TestClass的任何实例对象)
<ListBox ItemsSource="{Binding Source={x:Static d:TestClass.TestCollection}}"/>
Run Code Online (Sandbox Code Playgroud)
还要注意静态属性绑定一次.如果在运行时更改实例,则不会反映在UI上.在您的情况下,您正在处理ObservableCollection,因此当您从集合中添加/删除项目时,它将在UI上刷新,但如果您重新初始化列表,则更改将不会反映在UI上.如果您想要更新UI,您必须加注StaticPropertyChangedEvent
.如果有兴趣,请在这里查看我的答案.
归档时间: |
|
查看次数: |
4399 次 |
最近记录: |