我得到例外:
AmbiguousMatchException:发现模糊匹配
打开我的窗口时,解析了XAML。我有一个基础ViewModel类。它具有DataGrid的SelectedItem属性的属性
public class BaseViewModel<T> : ViewModel, INotifyPropertyChanged where T : MyClass
{
protected T _selectedItem;
public T SelectedItem
{
get
{
return _selectedItem;
}
set
{
_selectedItem = value;
OnPropertyChanged();
}
}
}
在我继承的ViewModel中,我覆盖了产生异常的属性
public new MyInheritedClass SelectedItem
{
get
{
return _selectedItem;
}
set
{
_selectedItem = value;
OnPropertyChanged();
//Do other stuff
}
}
那么如何使用覆盖属性而不会出现异常?
答案 0 :(得分:1)
为什么要在派生类中重新定义属性?派生类的类型参数应指定属性的类型:
public class MyInheritedClass : BaseViewModel<MyClass>
{
//no need to define a new SelectedItem property...
}
在上面的示例中,代码MyInheritedClass
已经具有SelectedItem
类型的MyClass
属性。它已在基类中定义。你不需要创建一个新的。
如果属性需要在派生类中执行一些特殊操作,则应在基类中将属性定义为virtual
:
public virtual T SelectedItem
{
get
{
return _selectedItem;
}
set
{
_selectedItem = value;
OnPropertyChanged();
}
}
...并在派生类中覆盖它:
public override MyClass SelectedItem
{
get
{
return _selectedItem;
}
set
{
_selectedItem = value;
OnPropertyChanged();
//Do other stuff
}
}
答案 1 :(得分:0)
如果定义了基类中已经存在的Property(或Dependency属性的访问器),则会发生这种情况。因为那样会使您变得模棱两可。您必须覆盖(主题:虚拟)或新(隐藏)它。否则,WPF中发生的反射将处理歧义。
示例:
Auth::user()->unreadNotifications->where('id', $request->get('id'))->markAsRead()