【发布时间】:2011-12-02 00:20:04
【问题描述】:
这个问题看起来像这样: Programmatically binding List to ListBox 但就我的例子而言,这篇文章中给出的答案对我不起作用! 无论如何,我查看了大约 10/15 个类似的帖子,但没有一个有用
这是我的 xaml 代码:
<Grid>
<ListBox Name="ListBoxx"/>
</Grid>
这是背后的代码:
namespace WpfApplication1
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
ObservableCollection<string> MyCollection = new ObservableCollection<string>();
Random random = new Random();
System.Timers.Timer aTimer = new System.Timers.Timer();
aTimer.Elapsed += (sender, e) =>
{
MyCollection.Add(random.Next(0, 100).ToString());
};
aTimer.Interval = 500;
aTimer.Enabled = true;
Binding myBinding2 = new Binding();
myBinding2.Source = this;
myBinding2.Path = new PropertyPath("MyCollection");
ListBoxx.SetBinding(ListBox.ItemsSourceProperty, myBinding);
}
}
}
据我所知,我的类不必从 INotifyPropertyChanged 继承,因为我使用的是 ObservableCollection。
我不想在 xaml 代码中使用 {Binding}。
我试过这段代码:
ListBoxx.ItemsSource = MyCollection;
这“有效”,但我遇到了线程崩溃。我知道我可以使用 Dispatcher 来修复它,但它不能用我的代码修复。我想在我的代码 sn-p 中使用“真实”绑定(可配置)。
结果是我没有出错,但 ListBox 没有更新:/
我尝试添加这些行:
MyCollection.Add("aaa");
MyCollection.Add("bbb");
MyCollection.Add("ccc");
MyCollection.Add("ddd");
但我在我的应用程序中没有得到任何东西,所以我真的认为这是一个绑定问题。无论如何,我确定我的计时器没问题,问题不在这里。
我也尝试过像这样将 MyCollection 作为属性:
private ObservableCollection<string> _MyCollection = new ObservableCollection<string>();
public ObservableCollection<string> MyCollection { get { return _MyCollection; } }
但它也不起作用:/(没有错误但没有更新)
【问题讨论】:
-
一个 WPF UI 元素从 Dispatcher 获取其数据。尝试使用 path 与 ItemsSource 不会愚弄它。为什么反对 XAML 中的绑定?最后它解析为相同的绑定。在代码中确实提供了更多的调试。您的计时器可能正在运行,但在计时器和 UI 之间的是 Dispatcher。