问题很简单:更新ItemsSource
时Combobox不会“刷新”,例如新项目似乎没有添加到组合框中的项目列表中。
我已经尝试过这个问题的解决方案:WPF - Auto refresh combobox content没有运气。
这是我的代码, XAML:
<ComboBox Name="LeadTypeComboBox" ItemsSource="{Binding LeadTypeCollection}" />
视图模型:
public ObservableCollection<XmlNode> LeadTypeCollection { get; set; }
我更新此集合的方式是在单独的方法中,该方法从更新的XML文件中加载数据:this.LeadTypeCollection = GetLeadTypesDataSource();
我也尝试使用Add
进行测试:
this.LeadTypeCollection = GetLeadTypesDataSource();
ItemToAdd = LeadTypeCollection[LeadTypeCollection.Count - 1];
this.LeadTypeCollection.Add(ItemToAdd);
代码更新集合肯定会启动,我可以在调试时看到此集合中的新项目,但我没有在组合框中看到它们。
在xaml代码隐藏工作中执行此操作:LeadTypeComboBox.ItemsSource = MyViewModel.GetLeadTypesDataSource();
但我想用MVVM实现这一点,即代码必须在ViewModel中,而不能识别LeadTypeComboBox控件。
答案 0 :(得分:7)
Firedragons答案可行,但我更喜欢初始化LeadTypeCollection一次并使用clear,添加remove来更新你的收藏。
var update = GetLeadTypesDataSource();
this.LeadTypeCollection.Clear();
foreach(var item in update)
{
this.LeadTypeCollection.Add(item);
}
如果datacontext正确
,你的xaml绑定应该有效<ComboBox Name="LeadTypeComboBox" ItemsSource="{Binding LeadTypeCollection}" />
答案 1 :(得分:5)
我想我以前见过这个,解决方法是更新集合属性以提高更改。
即
public class MyViewModel : INotifyPropertyChanged
{
private ObservableCollection<XmlNode> leadTypeCollection;
public string LeadTypeCollection
{
get { return leadTypeCollection; }
set
{
if (value != leadTypeCollection)
{
leadTypeCollection = value;
NotifyPropertyChanged("LeadTypeCollection");
}
}
public MyViewModel()
{
leadTypeCollection = new ObservableCollection<XmlNode>();
}
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(String info)
{
PropertyChanged.Raise(this, info);
}
}
我有一个用于提升属性的扩展方法(在stackoverflow上的其他位置找到):
public static void Raise(this PropertyChangedEventHandler handler, object sender, string propertyName)
{
if (null != handler)
{
handler(sender, new PropertyChangedEventArgs(propertyName));
}
}
答案 2 :(得分:1)
一种简单的方法是使用空列表更改ItemsSource,然后将其更改回更新的源。我的项目中的代码片段正在运行:
RulesTable.ItemsSource = Rules.rulesEmpty;
RulesTable.ItemsSource = Rules.Get();