Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.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# ObservableCollection移除/添加方法不起作用,即使列表中的项_C#_Collections - Fatal编程技术网

C# ObservableCollection移除/添加方法不起作用,即使列表中的项

C# ObservableCollection移除/添加方法不起作用,即使列表中的项,c#,collections,C#,Collections,我对从集合中添加和删除项目有点问题 private ObservableCollection<PrintDocumentSettingsModel> _AllPrintingFormats; public ObservableCollection<PrintDocumentSettingsModel> PrintingFormats { get { var formats = new Obse

我对从集合中添加和删除项目有点问题

    private ObservableCollection<PrintDocumentSettingsModel> _AllPrintingFormats;
    public ObservableCollection<PrintDocumentSettingsModel> PrintingFormats
    {
        get
        {
            var formats = new ObservableCollection<PrintDocumentSettingsModel>(
                _AllPrintingFormats.Where(x => x.IsStandartPrinter == IsStandartPrinter));
            if (!formats.Contains(SelectedFormat))
                SelectedFormat = formats.FirstOrDefault();
            return formats;
        }
        set { _AllPrintingFormats = value; OnPropertyChanged("PrintingFormats"); }
    }

    private bool _IsStandartPrinter;
    public bool IsStandartPrinter
    {
        get { return _IsStandartPrinter; }
        set
        {
            _IsStandartPrinter = value;
            OnPropertyChanged("IsStandartPrinter");
            OnPropertyChanged("PrintingFormats");
        }
    }

    private void DeleteFormat()
    {
        if (SelectedFormat != null && SelectedFormat.IsEditable &&
            PrintingFormats.Contains(SelectedFormat))
        {
            PrintingFormats.Remove(SelectedFormat);
            OnPropertyChanged("PrintingFormats");
        }
    }

那么诀窍是什么呢?

这不是编写属性的好方法。属性应该返回类中的私有对象(无论是显式声明还是隐式声明),除非在某些情况下该属性与任何实际的私有成员无关

当你写这篇文章时:

    get
    {
        var formats = new ObservableCollection<PrintDocumentSettingsModel>(
            _AllPrintingFormats.Where(x => x.IsStandartPrinter == IsStandartPrinter));
        if (!formats.Contains(SelectedFormat))
            SelectedFormat = formats.FirstOrDefault();
        return formats;
    }
    set { _AllPrintingFormats = value; OnPropertyChanged("PrintingFormats"); }
不会马上决定。也就是说,在这个调用中,您不会得到满足LINQ标准的元素。这将在返回
格式后得到解决,这意味着另一个线程所做的任何更改都将在行和实际使用
格式之间产生不同的结果

如果要维护该属性并保持其原样,您可以按照问题第二部分中的操作,直接使用
\u AllPrintingFormats
。但是,我建议将
打印格式更改为:

get { return _AllPrintingFormats }
set 
{ 
    _AllPrintingFormats = value; 
    OnPropertyChanged("PrintingFormats"); 
}

如果确实需要LINQ查询,可以在
PrintingFormats
上执行,而不是由属性执行

显然,它不起作用。
PrintingFormats
中的getter不会返回
\u AllPrintingFormats
。相反,它返回一个新对象,该对象稍后将被垃圾收集。您所做的任何修改都将在
get
函数中的
var格式上进行,而不会反映在
\u AllPrintingFormats
上。在
DeleteFormat()
中,使用
\u AllPrintingFormats
而不是
PrintingFormats
我明白了。如何更改
get
函数以返回当前集合?@AlekseyPavlov
get{return\u AllPrintingFormats;}
var formats = new ObservableCollection<PrintDocumentSettingsModel>(
        _AllPrintingFormats.Where(x => x.IsStandartPrinter == IsStandartPrinter));
get { return _AllPrintingFormats }
set 
{ 
    _AllPrintingFormats = value; 
    OnPropertyChanged("PrintingFormats"); 
}