c#代码以错误的顺序执行-奇怪的行为
我有一个c#代码以错误的顺序执行-奇怪的行为,c#,wpf,events,windows-runtime,C#,Wpf,Events,Windows Runtime,我有一个列表视图绑定到一个视图模型,该视图模型在一个简单的示例应用程序中包含一个可观察集合 public class ViewModel : INotifyPropertyChanged { public ViewModel(){} public event PropertyChangedEventHandler PropertyChanged; public ObservableCollection<Item> _items; public Ob
列表视图
绑定到一个视图模型,该视图模型在一个简单的示例应用程序中包含一个可观察集合
public class ViewModel : INotifyPropertyChanged
{
public ViewModel(){}
public event PropertyChangedEventHandler PropertyChanged;
public ObservableCollection<Item> _items;
public ObservableCollection<Item> Items
{
get
{
return this._items;
}
set
{
if (value != this._items)
{
this._items = value;
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs("Items"));
}
}
}
}
public class Item
{
public string Name;
}
公共类视图模型:INotifyPropertyChanged
{
公共视图模型(){}
公共事件属性更改事件处理程序属性更改;
公开可见的收集项目;
公共可观测收集项目
{
得到
{
归还此物品;
}
设置
{
如果(值!=此.\u项)
{
此项。_项=值;
if(PropertyChanged!=null)
房地产变更(这是指新的房地产变更项目);
}
}
}
}
公共类项目
{
公共字符串名称;
}
以下函数绑定到ListView的SelectionChanged事件
private void ItemListView_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
model.Items.Add(new Item { Name = "added item" });
model.Items = new ObservableCollection<Item> { new Item { Name = "new item 1" }};
}
private void ItemListView\u SelectionChanged(对象发送者,selectionchangedventargs e)
{
model.Items.Add(新项{Name=“added Item”});
model.Items=newobserveCollection{newitem{Name=“newitem1”};
}
当事件触发时,应该会发生这种情况
observedcollection
ObservableCollection
设置为新集合[单个项目,“新项目1”]ObservableCollection
设置为新集合[单个项目,“新项目1”] model.Items = ... ;
在SelectionChanged中,同样的项目是非常粗体的。它将再次触发SelectionChanged,只有当选择保持为none(索引-1)时,您才不会进入无限循环。observable collection无需inotify,请尝试以下操作:
public class ViewModel : INotifyPropertyChanged
{
public ViewModel(){}
public ObservableCollection<Item> Items ;
}
公共类视图模型:INotifyPropertyChanged
{
公共视图模型(){}
公众可观察到的收集项目;
}
如果使用ObservableCollection,为什么每次都要创建新的集合实例?你不能只操作现有的一个吗?\你的项目应该是私有的和新的。如果你想要一个全新的收藏,那就不要再新了。在SelectionChanged中更改收藏是一个棘手的问题+1 henk应该是:public observeCollection Items{get;private set;},并在构造函数中初始化它。