WPF ItemsSource内部集合
本文关键字:集合 内部 ItemsSource WPF | 更新日期: 2023-09-27 18:11:21
我有一个UserControl与ObservableCollection属性。这个属性应该用于绑定,但是为了满足OOP的基本规则,我不希望它在程序集之外可见。这里是一个演示的例子,它的工作,但当我改变访问修饰符数据内部它不工作了:
XAML:<Window x:Class="WpfApplication3.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" x:Name="Root">
<ListBox ItemsSource="{Binding Data, ElementName=Root}"/>
</Window>
和后面的代码:
using System;
using System.Windows;
using System.Collections.ObjectModel;
namespace WpfApplication3
{
public partial class MainWindow : Window
{
private readonly ObservableCollection<string> _data = new ObservableCollection<string>();
public ObservableCollection<string> Data
{
get { return _data; }
}
public MainWindow()
{
InitializeComponent();
Data.Add("XXX");
Data.Add("YYY");
new System.Threading.Thread(() =>
{
for (int i = 0; i < 3; i++)
{
Dispatcher.Invoke(new Action(() => Data.Add("ZZZ " + i)));
System.Threading.Thread.Sleep(1000);
}
}).Start();
}
}
}
实现这一目标的最佳方法是什么?
谢谢你的努力
尝试在MainWindow构造函数中设置ItemSource
XAML:<Window x:Class="WpfApplication3.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" x:Name="Root">
<ListBox Name="listbox"/>
</Window>
和
背后的代码using System;
using System.Windows;
using System.Collections.ObjectModel;
namespace WpfApplication3
{
public partial class MainWindow : Window
{
private readonly ObservableCollection<string> _data = new ObservableCollection<string>();
internal ObservableCollection<string> Data
{
get { return _data; }
}
public MainWindow()
{
InitializeComponent();
listbox.ItemSource = this.Data;
Data.Add("XXX");
Data.Add("YYY");
new System.Threading.Thread(() =>
{
for (int i = 0; i < 3; i++)
{
Dispatcher.Invoke(new Action(() => Data.Add("ZZZ " + i)));
System.Threading.Thread.Sleep(1000);
}
}).Start();
}
}
}
WPF中的数据绑定仅适用于公共属性。
MSDN
作为绑定源属性使用的属性必须成为类的公共属性。显式定义的接口属性不能为绑定目的而访问,也不能被保护,没有基的私有、内部或虚拟属性实施