In WPF erbt der abgeleitete Usercontrol die selbstbasierte Klasse und gemeinsame öffentliche Funktionen, der von den abgeleitete Usercontrols verborgene Code kann auf die Basisklassenverarbeitung verweisen. Der Zugriff auf DataContext aus der Basisklasse kann jedoch eine InvalidCastException verursachen, da es sich um einen Ableitungsart in den abgeleiteten UserControls handelt.
Schauen wir uns ein Beispiel an:
<code class="language-csharp">private void SomeClick(object sender, RoutedEventArgs e) { HandleClick(sender); MyDataGrid.Items.Refresh(); }</code>
in der Basisklasse UserControl:
<code class="language-csharp">public class BaseUserControl : UserControl { protected void HandleClick(object sender) { var vm = (BaseViewModel<Part>)DataContext; ... } }</code>
Dies führt zu InvalidCastException, da der DataContext -Typ in UserControls BaseViewModel
Warum kann es nicht direkt geändert werden?
Konvertieren von Gene & lt; Betrachten Sie das folgende Beispiel:
Wenn diese Umwandlung erlaubt ist, wird ein Schaf zu Tieren hinzugefügt, und es darf es tatsächlich zu Wölfen hinzufügen, was dazu führt, dass der Typ nicht übereinstimmt.Lösung
<code class="language-csharp">List<wolf> wolves = new List<wolf>(); List<animal> animals = (List<animal>)wolves; // 无法转换</code>
Um dieses Problem zu lösen, kann die Zusammenarbeit oder der Wechselrichter der Schnittstelle gezwungen werden, nur den erforderlichen Typ zu lesen. Diese Methode kann jedoch nur möglich sein, wenn die von Ihnen verwiesene Klasse die erforderliche Schnittstelle erreicht. Dies erfordert die Anpassung der Codestruktur. Die spezifische Implementierung hängt von der Definition und den tatsächlichen Bedürfnissen von ab.
Das obige ist der detaillierte Inhalt vonWie kann man in WPF UserControls sicher generisches bis generisches gründen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!