Supongamos que tenemos un modelo de vista genérico como este:
public class MyViewModel<T> : INotifyPropertyChanged where T : Class1 { private T _objectModel; public MyViewModel(T object) { _objectModel= object; } public event PropertyChangedEventHandler PropertyChanged; } Cuando quiero vincular este modelo de vista a DataContext de mi UserControl en XAML , ¡no puedo! El editor XAML no encuentra la clase Mi modelo de vista. ¿Cómo debo referirme a un tipo genérico en XAML?
<UserControl.DataContext> <s:MyViewModel<T>/> // How should I write this here???? </UserControl.DataContext> En el código anterior, s es un alias para mi espacio de trabajo, y si convierto mi modelo de vista genérico en una clase concreta, funciona normalmente.
Al trabajar con XAML, no puede crear instancias de un modelo de vista con un parámetro genérico en código XAML.
Para evitar esto, debe utilizar la herencia , aquí hay un ejemplo:
public abstract class ViewModel<T>Uso:
public class MovieViewModel : ViewModel<Movie> ... public class GenreViewModel : ViewModel<Genre>Crear una nueva clase para cada modelo parece un poco estúpido, sin embargo, esto simplemente no es cierto. Al suponer que cada modelo de vista contiene un modelo, prácticamente se ha preparado para seguir este patrón en todos los modelos de vista, ya que su modelo de vista base impone esta restricción.
Yo personalmente uso el patrón de usar una clase base ViewModel<T> , donde T es el modelo.
Sin duda, es una buena idea mantener la lógica separada de su modelo de vista base. Un modelo de vista para cada modelo es, de hecho, un muy buen patrón para implementar.
Hay otra forma en que puede lograr lo que busca, esto es simplemente eliminar el genérico de la base del modelo de vista, considere el ejemplo:
public class ViewModel { public object Model { get; protected set; } } Ahora, si rellena Model con, digamos, Movie , entonces XAML lo verá como Movie , y no como object . Ahora, esto es bastante ingenioso en lo que respecta a su lado XAML, sin embargo, cuando comience a trabajar con este modelo en C # , tendrá todo tipo de problemas, ya que tendrá que convertir el objeto en cualquier tipo que sea. utilizando. Así que no recomendaría esto en absoluto.
Otro método para sortear esto sería configurar DataContext en código subyacente, y si vas a hacer eso, entonces, bueno, solo Dios puede salvarte ahora. Las ideas principales en torno al patrón de diseño de MVVM son la separación de la lógica de vista y la capa empresarial (modelos de vista), tan pronto como su vista comienza a crear instancias de modelos de vista, se pierde esa buena separación.
Ahora, diciendo eso, no hay nada que te impida hacer esto, lo he dicho muchas veces antes. MVVM es un patrón de diseño, no la ley , si desea configurar DataContext en código subyacente, entonces es justo, sin embargo, es importante que esté al tanto de las implicaciones.
Podría crear una clase que herede de su ViewModel genérico y usar eso
public class PersonViewModel : ViewModel<Person>XAML:
<UserControl.DataContext> <s:PersonViewModel/> </UserControl.DataContext>No puede establecer un modelo de vista genérico en XAML porque XAML requiere tipos conocidos en tiempo de compilación.
La inyección de dependencia es tu mejor apuesta
public class MyControl : UserControl{ public MyControl(Object viewModel){ this.DataContext = viewModel; } }