WPF MVVM ListBox / ComboBox ItemsSource不会从ViewModel更新UI

时间:2014-02-11 07:55:45

标签: wpf mvvm binding observablecollection itemssource

我有一个容器,例如listbox,combobox等,它的ItemsSource属性绑定到我的视图模型中的可观察集合。 当我尝试通过我的VM中的某些方法添加/删除集合中的项目时,它不会反映在UI中, UI实际刷新的唯一方法是,如果我为集合分配一个新值(即带有相关数据的另一个集合),这将迫使他重新绑定整个集合。

也许我缺少/不了解集合绑定问题,无论哪种方式,如果有人有解决方案/良好解释/两者都会很棒。 这是我的View中的一个示例(在本例中是一个列表框)

<ListBox
                Grid.Row="9"
                Grid.Column="1"
                Grid.ColumnSpan="3"
                Width="200"
                Height="200"
                ItemsSource="{Binding PreSavedRecordingScheduleList,UpdateSourceTrigger=PropertyChanged}"
                SelectedItem="{Binding SelectedPreSavedRecordingSchedule,UpdateSourceTrigger=PropertyChanged}"
                DisplayMemberPath="Display"/>

这是我的ViewModel:

private ObservableCollection<ScheduledRecordingObject> m_PreSavedRecordingScheduleList;

PreSavedRecordingScheduleList = new ObservableCollection<ScheduledRecordingObject>();

public ObservableCollection<ScheduledRecordingObject> PreSavedRecordingScheduleList
       {
            get
            {
                return m_PreSavedRecordingScheduleList;
            }
            set
            {
                m_PreSavedRecordingScheduleList = value;
                OnPropertyChanged("PreSavedRecordingScheduleList");
            }
        }

ScheduledRecordingObject也实现了INotifyPropertyChanged。

2 个答案:

答案 0 :(得分:0)

视图模型

public ObservableCollection<yourType> MyItemsSource {get;set}

在构造函数中初始化一次并使用clear,添加和删除来改变它

查看

 <ListBox ItemsSource="{Binding MyItemsSource}"/>

确保设置了正确的DataContext。

它应该如何看待你的代码

编辑: 您发布的代码的一些提示:

//remove the UpdateSourceTrigger=PropertyChanged - makes no sense the Mode is OneWay anyway :)
ItemsSource="{Binding PreSavedRecordingScheduleList}"

//the following line should just called once and at best in ctor
//but the binding will of course work too when you assign a new collection
PreSavedRecordingScheduleList = new ObservableCollection<ScheduledRecordingObject>();  

所有代码看起来都很好,如果viewmodel是Listbox的Datacontext,那么它应该可以工作。让我知道Snoop正在展示的内容:)

答案 1 :(得分:0)

删除OnPropertyChanged(“PreSavedRecordingScheduleList”);来自ObservableCollection。实际上你不需要支持领域。在ObservableCollection上附加CollectionChanged事件,类似这样

1-在ViewModel构造函数中附加事件CollectionChanged

PreSavedRecordingScheduleList = new ObservableCollection<ScheduledRecordingObject>();

PreSavedRecordingScheduleList.CollectionChanged += PreSavedRecordingScheduleList_CollectionChanged;

2-在事件处理程序中注入OnPropertyChanged(“PreSavedRecordingScheduleList”)

void PreSavedRecordingScheduleList_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
    {
        OnPropertyChanged("PreSavedRecordingScheduleList");
    }