menus icon desplegable context c# wpf dynamic menu commandbinding

c# - icon - popup menu wpf



Usar el DataContext del padre(WPF-Enlace de comando de menĂº dinĂ¡mico) (4)

Bien, entonces, ¿qué hay de modificar su clase de elementos de datos para que tenga una propiedad que haga referencia a toda la vista del modelo?

Si su ItemsSource es de tipo ObservableCollection<DataItem> entonces modifique el tipo DataItem de la siguiente manera:

public class DataItem { public BusinessObject Value { get; set; } private ModelView modelView; public ModelView ModelView { get { return modelView; } } public DataItem(ModelView modelView) { this.modelView = modelView; } }

Revisé esta web y google y las soluciones no funcionaron para mí.

Tengo un comando en el ViewModel de un UserControl. Bueno, el usercontrol tiene un ItemsControl enlazado a un ObservableCollection. Dentro de DataTemplate de ItemsControl.ItemTemplate tengo un botón y quiero usar el comando. No puedo vincular el comando porque dentro de DataTemplate, el contexto de datos no es ViewModel, sino un elemento de ObservableCollection.

La pregunta es: ¿cómo puedo vincular el botón al comando si se pierde el contexto de datos padre?

Creo que esto necesita una solución fácil porque creo que este es un problema común.

Imagina este sceneario:

Tiene un elemento ListBox con una colección observable como ItemsSource, por lo que está utilizando una plantilla de datos dentro del ListBox para cada elemento de la colección. Bueno, quiere eliminar el elemento seleccionado y pone un botón en cada fila para ese trabajo. ¿Cómo haces eso?

En MVP, puedo hacer esto en el evento click del botón:

Button but = e.Source as Button; if (but != null) Presenter.ActualNote = but.DataContext as Note;

En breve. Envía el contexto de datos de la fila (el elemento seleccionado) al presentador.

Pero, ¿cómo puedo hacerlo a la manera de mvvm? Porque necesito usar un comando pero no puedo asignar el comando al botón porque el botón no sabe nada sobre ViewModel (donde existe el comando).

Como puede ver, el botón debe existir dentro de la plantilla de datos, luego el contexto de datos ya no es el ViewModel ... Por eso necesito acceder al DataContext del padre para acceder al comando.

Espero que entiendas mejor mi problema.

Gracias.


RelativeSource funciona, pero no creo que sea correcto dejar que los controles merodeen entre las propiedades de los demás. Es extraño que el botón colocado dentro de una vista de elemento haga algo con una fuente de datos externa en lugar de con el elemento encuadernado. Es posible que deba revisar el diseño del código del programa.


Si desea una solución sucia, que rompa MVVM, configure Tag = "{Binding}" en el botón y administre el evento Click. En el controlador de eventos, llame al comando en su ViewModel.


Use el enlace a continuación para el comando de su botón:

{Binding DataContext.CommandName, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type MyUserControl}}}

Esto le indicará que busque su UserControl y use su DataContext.