c# - severa - enfermedades que causan caida de cabello
Control de usuario de pérdida de cabello y MVVM (2)
Quizás he entendido mal, pero parece que estás tratando de usar el enlace en el código?
public MyUserControl()
{
InitializeComponent();
// Set your datacontext.
var binding = new Binding("SomeVMProperty");
binding.Source = this.DataContext;
SetBinding(MyDependencyProperty, binding);
}
Tengo un control de usuario escrito en C # y WPF usando el patrón MVVM.
Todo lo que quiero hacer es tener una propiedad en el ViewModel vinculado expuesto a fuera del control. Quiero poder vincularme a él y quiero que cualquier cambio fuera del control que esté vinculado al valor expuesto capte cualquier cambio en la propiedad.
Esto suena simple, pero me hace sacar mi cabello (y no queda mucho de eso).
Tengo una propiedad de dependencia en el control del usuario. ViewModel tiene la propiedad de implementar la interfaz INotifyPropertyChanged y está llamando correctamente al evento PropertyChanged.
Algunas preguntas: 1) ¿Cómo recojo los cambios a la Propiedad de ViewModel y la ata a la Propiedad de Dependencia sin romper la separación de MVVM? Hasta ahora, la única forma en que he logrado hacer esto es asignar el evento ViewModels PropertyChanged en el código de Controles detrás, que definitivamente no es MVVM.
2) Utilizando el fudge anterior, puedo hacer que la propiedad Dependency active su PropertyChangedCallback, pero cualquier cosa que se encuentre fuera del control no recoge el cambio.
Tiene que haber una manera simple de hacer todo esto. Tenga en cuenta que no he publicado ningún código aquí. Espero no influir en las respuestas con mi código actual. Además, probablemente todos te reirías de todos modos ...
Robar
OK, para aclarar - ejemplos de código:
código de control de usuario detrás:
public static DependencyProperty NewRepositoryRunProperty = DependencyProperty.Register("NewRepositoryRun", typeof(int?), typeof(GroupTree),
new FrameworkPropertyMetadata( null, new PropertyChangedCallback(OnNewRepositoryRunChanged)));
public int? NewRepositoryRun
{
get { return (int?)GetValue(NewRepositoryRunProperty); }
set
{
SetValue(NewRepositoryRunProperty, value);
}
}
private static void OnNewRepositoryRunChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
if (e.OldValue != e.NewValue)
{
}
}
public GroupTree()
{
InitializeComponent();
GroupTreeVM vm = new GroupTreeVM();
this.DataContext = vm;
}
Viewmodel (GroupTreeVM.cs)
private int? _NewRepositoryRun;
public int? NewRepositoryRun
{
get
{
return _NewRepositoryRun;
}
set
{
_NewRepositoryRun = value;
NotifyPropertyChanged();
}
}
Y ahora para mi respuesta semanal de "no hagas eso" ...
Crear un ViewModel para su UserControl es un olor a código.
Estás experimentando este problema debido a ese olor, y debería ser una indicación de que estás haciendo algo mal.
La solución es deshacerse de la máquina virtual construida para UserControl. Si contiene lógica comercial, debe moverse a una ubicación adecuada en otro ViewModel.
Debería pensar en un UserControl como nada más que un control más complejo. ¿El TextBox tiene su propio ViewModel? No. Vincula la propiedad de su VM a la propiedad Text del control, y el control muestra su texto en su UI.
Piense en UserControls en MVVM de esta manera: para cada modelo, tiene un UserControl y está diseñado para presentar los datos en ese modelo al usuario. Puede usarlo en cualquier lugar que desee para mostrarle al usuario ese modelo. ¿Necesita un botón? Exponga una propiedad ICommand en su UserControl y permita que su lógica de negocios se vincule. ¿Su lógica de negocio necesita saber algo que está sucediendo adentro? Agrega un evento enrutado.
Normalmente, en WPF, si te preguntas por qué duele hacer algo, es porque no deberías hacerlo.