Cómo hacer un modo de búsqueda de origen encontrar un antecesor (o equivalente) en UWP

Estoy tratando de hacer algo que uno pensaría que debería ser muy simple (al menos está en WPF). Tengo una página con un listbox y un datatemplate, ahora que datatemplate llama a un control de usuario con un botón. No es nada sofisticado, pero el comando de botones no es parte de listboxsource, y no puedo encontrar una manera simple de decirle al botón dónde buscar el comando. Aquí está el escenario

         

Tenga en cuenta que esto no se comstack ya que en UWP no hay un modo encontrar antepasado? Cómo debo hacerlo, sigo buscando en google pero no puedo encontrar nada al respecto.

Gracias

La respuesta es Propiedad de dependencia. He tenido el mismo problema. Primero, si no tiene involucrado DataTemplate, la solución es directa:

 (this.Content as FrameworkElement).DataContext = this; 

Establece el DataContext del UserControl en su constructor a su código detrás.

Si está planeando usar su Comando dentro de un DataTemplate, también necesitará una DependecyProperty.

Ejemplo:

    

Y para hacer una copia de seguridad, crea una propiedad de dependencia para ese comando:

  public ICommand MyCommand { get { return (ICommand)GetValue(MyCommandProperty); } set { SetValue(MyCommandProperty, value); } } // Using a DependencyProperty as the backing store for MyCommand. This enables animation, styling, binding, etc... public static readonly DependencyProperty MyCommandProperty = DependencyProperty.Register("MyCommand", typeof(ICommand), typeof(ownerclass), new PropertyMetadata(0)); 

Entonces, cuando use su control de usuario, tendrá una propiedad MyCommand en ella que podrá vincular a cualquier comando de su ViewModel siempre que el elemento primario de plantillas coincida con el que usted proporcionó y también el parámetro esté vinculado al elemento real que el el control es parte de.

  

Ejemplo simple:

Código de control de usuario detrás

  public sealed partial class ListviewUserControl : UserControl { public ListviewUserControl() { this.InitializeComponent(); (this.Content as FrameworkElement).DataContext = this; } public ICommand ButtonCommand { get { return (ICommand)GetValue(ButtonCommandProperty); } set { SetValue(ButtonCommandProperty, value); } } // Using a DependencyProperty as the backing store for ButtonCommand. This enables animation, styling, binding, etc... public static readonly DependencyProperty ButtonCommandProperty = DependencyProperty.Register("ButtonCommand", typeof(ICommand), typeof(ListviewUserControl), new PropertyMetadata(null)); public ObservableCollection ItemsSource { get { return (ObservableCollection)GetValue(ItemsSourceProperty); } set { SetValue(ItemsSourceProperty, value); } } // Using a DependencyProperty as the backing store for ItemsSource. This enables animation, styling, binding, etc... public static readonly DependencyProperty ItemsSourceProperty = DependencyProperty.Register("ItemsSource", typeof(ObservableCollection), typeof(ListviewUserControl), new PropertyMetadata(new ObservableCollection())); } 

UserControl Xaml:

           

Uso en Page.xaml:

  

Existe un concepto llamado x:Bind en Windows 10 UWP. En x:Bind el código detrás se convierte en el contexto de datos para el enlace. Por lo tanto, si agrega una propiedad en el código de control del usuario que está detrás, apuntando al modelo de vista, puede usarse para vincular el comando.

 public class MyButton { public ViewModel ButtonViewModel { get { return ButtonViewModelObject; } } } 

En XAML –

  

Consulte: https://msdn.microsoft.com/en-us/library/windows/apps/mt204783.aspx

  OR 

Puede usar ElementName con enlace tradicional para lograr el resultado.

  

Consulte: no se puede acceder al contexto de datos del elemento primario

Actualización: para acceder al comando eliminar desde el contexto de datos de la página, se puede usar el siguiente método, asumiendo que el cambio del contexto de datos de usercontrol (del cliente) al contexto de datos de la página no afecta a ninguna otra cosa presente dentro del control de usuario.