【发布时间】:2011-10-19 21:52:27
【问题描述】:
我正在尝试像这样在 WPF 中绑定一个组合框,
<ComboBox Width="350" Margin="5" IsEditable="True" ItemsSource="{Binding ComboboxItems}" DisplayMemberPath="Name">
public List<ExpandoObject> ComboboxItems
{
get
{
return comboboxItems;
}
}
如果我在我的视图模型中设置这样的列表,
comboboxItems.Clear();
foreach (ExpandoObject comboboxItem in repository.LoadComboboxItems())
{
comboboxItems.Add(comboboxItem);
}
NotifyPropertyChanged(this, x => x.ComboboxItems);
NotifyPropertyChanged 似乎工作,因为 ComboboxItems 上的断点被命中,但随后组合框列表不会在 GUI 上更新。 Snoop 没有显示绑定错误或类似情况。
上面的列表第一次更新时似乎可以工作,所以我认为它与使用 ExpandoObject 没有任何关系。
更新:
使用可观察集合有效,但我想知道我是否在这样的视图模型中有一个设置器,它绑定到 GUI 上的控件,
public string Database
{
get
{
return importData.Database;
}
set
{
importData.Database = value;
NotifyPropertyChanged(this, x => x.Database);
comboboxItems.Clear();
foreach (ExpandoObject comboboxItem in repository.LoadComboboxItems())
{
comboboxItems.Add(comboboxItem);
}
NotifyPropertyChanged(this, x => x.ComboboxItems);
}
}
该设置器是否在后台线程上运行?我问的原因是如果从数据库加载项目需要一段时间,setter 会阻止 GUI 吗?
这是我第一次尝试使用 ObservableCollection 时出错的地方,方法是使用 BackgroundWorker 在后台线程上运行 setter 中的代码。在这些情况下更新 ObservableCollection 会导致异常。
【问题讨论】:
-
这是最好的解决方案,扩展方法AddOnUI stackoverflow.com/questions/2091988/…
-
AddOnUI 方法是一个非常巧妙的解决方案。我相应地修改了我的 BeginInvoke 链接。