Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#代码以错误的顺序执行-奇怪的行为_C#_Wpf_Events_Windows Runtime - Fatal编程技术网

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;},并在构造函数中初始化它。