In applicazioni WPF di una certa complessità è molto facile trovarsi in situazioni in cui è utile sfruttare classi base per i controlli (es. UserControl e Window). In architetture MVVM, ad esempio, è possibile far ereditare i vari controlli da classi base generiche. Tuttavia, l’ implementazione dell’ereditarietà generica in WPF talvolta non è proprio immediata, soprattutto perché non sempre gli errori di build sono esplicativi.
In questo semplicissimo esempio di MVVM viene mostrato come si può specificare la classe base generica di una Window direttamente nello XAML.
Partiamo dalla Window:
public partial class CustomersWindow : WindowBase<CustomersViewModel>
{
public CustomersWindow() : base(new CustomersViewModel())
{
InitializeComponent();
}
...
}
La classe base generica della Window potrebbe essere qualcosa del genere...
public class WindowBase<T> : Window where T : ViewModelBase
{
public T ViewModel { get; set; }
public WindowBase() { }
public WindowBase(T viewModel)
{
this.ViewModel = viewModel;
base.DataContext = viewModel;
}
}
Arriviamo quindi al punto. Lo XAML che permette di specificare l’ereditarietà da classi generiche diventa:
<src:WindowBase
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:src="clr-namespace:MyApplication"
x:Class="MyApplication.CustomersWindow"
x:TypeArguments="src:CustomersViewModel" ...>
...
</src:WindowBase>
Tramite x:TypeArguments possiamo specificare il tipo generico della classe base.
ATTENZIONE: questa tecnica è applicabile solo per il nodo root del documento XAML.