如何在修改其ItemsSource ObservableCollection后刷新组合框

时间:2011-10-27 10:18:33

标签: wpf xaml data-binding mvvm observablecollection

问题很简单:更新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控件。

3 个答案:

答案 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();