2017-02-12 8 views
0

ich die Ausnahme erhalten:C#: AmbiguousMatchException: mehrdeutige Übereinstimmung gefunden

AmbiguousMatchException: zweideutiges Spiel

gefunden

wenn mein Fenster zu öffnen und die XAML analysiert wird. Ich habe eine ViewModel-Basisklasse. Es verfügt über eine Eigenschaft für die SelectedItem Eigenschaft eines Datagrid

public class BaseViewModel<T> : ViewModel, INotifyPropertyChanged where T : MyClass 
{ 
    protected T _selectedItem; 
    public T SelectedItem 
    { 
     get 
     { 
      return _selectedItem; 
     } 
     set 
     { 
      _selectedItem = value; 
      OnPropertyChanged(); 
     } 
    } 
} 

In meiner ererbten Ansichtsmodell ich diese Eigenschaft überschreiben, die die Ausnahme So

public new MyInheritedClass SelectedItem 
{ 
    get 
    { 
     return _selectedItem; 
    } 
    set 
    { 
     _selectedItem = value; 
     OnPropertyChanged(); 
     //Do other stuff 
    } 
} 

produziert, wie die overrided Eigenschaft verwenden und nicht eine Ausnahme bekommen?

Antwort

1

Warum definieren Sie die Eigenschaft in der abgeleiteten Klasse neu? Das Argument Typ der abgeleiteten Klasse sollte die Art der Immobilie angeben:

public class MyInheritedClass : BaseViewModel<MyClass> 
{ 
    //no need to define a new SelectedItem property... 
} 

In dem obigen Beispielcode MyInheritedClass hat bereits eine SelectedItem Eigenschaft vom Typ MyClass. Es ist bereits in der Basisklasse definiert. Sie müssen kein neues erstellen.

Wenn die Eigenschaft muss etwas Besonderes in der abgeleiteten Klasse tun, sollten Sie die Eigenschaft als virtual in der Basisklasse definieren:

public virtual T SelectedItem 
{ 
    get 
    { 
     return _selectedItem; 
    } 
    set 
    { 
     _selectedItem = value; 
     OnPropertyChanged(); 
    } 
} 

... und es in der abgeleiteten Klasse überschreiben:

public override MyClass SelectedItem 
{ 
    get 
    { 
     return _selectedItem; 
    } 
    set 
    { 
     _selectedItem = value; 
     OnPropertyChanged(); 
     //Do other stuff 
    } 
} 
+0

Weil ich etwas Besonderes für diese geerbte Klasse tun muss. Sehen Sie sich den Kommentar in der neuen Eigenschaft –

+0

an. Dann sollten Sie die Eigenschaft in der Basisklasse virtuell machen und sie in der abgeleiteten Klasse überschreiben. Siehe meine bearbeitete Antwort. – mm8