将 NotifyCollectionChangedAction.Replace 传递给 NotifyCollectionChangedEventArgs 失败
Passing NotifyCollectionChangedAction.Replace to NotifyCollectionChangedEventArgs fails
在自定义 属性 setter 上,我尝试调用我的自定义事件并将 NotifyCollectionChangedAction.Replace
作为参数传递给 NotifyCollectionChangedEventArgs
,但我得到了 System.ArgumentException
。
我做错了什么?
我的自定义事件:
public event EventHandler<NotifyCollectionChangedEventArgs> MyEntryChanged;
protected virtual void OnMyEntryChanged(NotifyCollectionChangedEventArgs e)
{
var handler = MyEntryChanged;
handler?.Invoke(this, e);
}
还有我的电话:
private TValue _value;
public TValue Value
{
get { return _value; }
set
{
if (Equals(_value, value)) return;
_value = value;
OnMyEntryChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Replace));
OnPropertyChanged();
}
}
参数Replace
要求您指定旧项目和新项目。
简单地在没有任何项目的情况下调用它会导致此异常。
在您的情况下,您可以这样调用它:
if (Equals(_value, value)) return;
int indexOfPreviousItem = 0; //wherever you store your item
TValue oldItem = _value;
_value = value;
OnMyEntryChanged(
new NotifyCollectionChangedEventArgs(
NotifyCollectionChangedAction.Replace,
value,
oldItem,
indexOfPreviousItem));
OnPropertyChanged();
在自定义 属性 setter 上,我尝试调用我的自定义事件并将 NotifyCollectionChangedAction.Replace
作为参数传递给 NotifyCollectionChangedEventArgs
,但我得到了 System.ArgumentException
。
我做错了什么?
我的自定义事件:
public event EventHandler<NotifyCollectionChangedEventArgs> MyEntryChanged;
protected virtual void OnMyEntryChanged(NotifyCollectionChangedEventArgs e)
{
var handler = MyEntryChanged;
handler?.Invoke(this, e);
}
还有我的电话:
private TValue _value;
public TValue Value
{
get { return _value; }
set
{
if (Equals(_value, value)) return;
_value = value;
OnMyEntryChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Replace));
OnPropertyChanged();
}
}
参数Replace
要求您指定旧项目和新项目。
简单地在没有任何项目的情况下调用它会导致此异常。
在您的情况下,您可以这样调用它:
if (Equals(_value, value)) return;
int indexOfPreviousItem = 0; //wherever you store your item
TValue oldItem = _value;
_value = value;
OnMyEntryChanged(
new NotifyCollectionChangedEventArgs(
NotifyCollectionChangedAction.Replace,
value,
oldItem,
indexOfPreviousItem));
OnPropertyChanged();