c# - tutorial - ¿Cuál es la mejor forma de pasar el evento a ViewModel?



wpf xaml (2)

El caso es: Tengo un evento de control en el que quiero que mi ViewModel reaccione. Actualmente estoy haciendo esto ejecutando un comando de botón invisible como en el ejemplo a continuación.

En View.xaml:

<Control x:Name="SearchResultGrid" ... DataRefreshed="SearchResultRefreshed" />
<Button x:Name="SearchResultRefreshedButton" Visibility="Collapsed" Command="{Binding SearchResultRefreshedCommand}" />

En View.xaml.cs:

private void SearchResultRefreshed(object sender, EventArgs e)
{
    if (SearchResultRefreshedButton.Command != null)
    {
        SearchResultRefreshedButton.Command.Execute(SearchResultGrid.ResultRowCount);
    }
}

Esto funciona bien, pero parece un truco para mí. Me pregunto si hay una forma mejor (estándar) de hacer esto. No pude encontrar ningún ejemplo y esto es lo que "inventé".

https://src-bin.com


Answer #1

Debe agregar una propiedad de dependencia DataRefreshed a su control para vincularlo

aquí un ejemplo de cómo puedes hacerlo

public static readonly DependencyProperty DataRefreshedProperty = DependencyProperty.Register(
  "DataRefreshed",
  typeof(bool),
  typeof("typeof yourcontrol here "),
  new FrameworkPropertyMetadata(null,
      FrameworkPropertyMetadataOptions.AffectsRender, 
      new PropertyChangedCallback(OnDataRefreshedChanged)
  )
);
public bool DataRefreshed
{
  get { return (bool)GetValue(DataRefreshedProperty); }
  set { SetValue(DataRefreshedProperty, value); }
}

Entonces puede manipular su propiedad como cualquier otra propiedad de WPF, por ejemplo, SearchResultRefreshed que se define en su ViewModel

<Control x:Name="SearchResultGrid" ... DataRefreshed="{Binding SearchResultRefreshed}" />
<Button x:Name="SearchResultRefreshedButton" Visibility="Collapsed" Command="{Binding SearchResultRefreshedCommand}" />

eche un vistazo al siguiente tutorial para comprender más dependecyproperty and attachedproperty


Answer #2

Personalmente, nunca tuve la necesidad de utilizar una propiedad adjunta para manejar un evento de control. En su ejemplo, de un control que desea saber cuándo 'SearchResultRefreshed' e informar al ViewModel a través del control oculto ... ¿por qué el ViewModel ya no sabe que los resultados se han actualizado?

Si los resultados provienen del ViewModel en primer lugar, y el enlace se usa para mostrarlos dentro de su control, entonces el conocimiento de que los resultados de la búsqueda se han actualizado debe ser impulsado por su ViewModel, no su vista.

Solo en unos pocos casos he encontrado la necesidad de abandonar ICommands y el enlace de datos.





mvvm