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
函数以返回当前集合?@AlekseyPavlovget{return\u AllPrintingFormats;}
var formats = new ObservableCollection<PrintDocumentSettingsModel>(
_AllPrintingFormats.Where(x => x.IsStandartPrinter == IsStandartPrinter));
get { return _AllPrintingFormats }
set
{
_AllPrintingFormats = value;
OnPropertyChanged("PrintingFormats");
}