C#:AmbiguousMatchException:找到了模糊匹配

时间:2017-02-12 13:49:00

标签: c# wpf xaml oop mvvm

我得到例外:

  

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
    }
}

那么如何使用覆盖属性而不会出现异常?

2 个答案:

答案 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()