我有一个容器,例如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。
答案 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");
}