MVVM cambiando el color de fondo de la rejilla al hacer clic

Soy un verdadero principiante en el patrón MVVM. Estoy tratando de cambiar el fondo de una cuadrícula al hacer clic en un botón. Tengo un xaml con una cuadrícula que contiene un botón y un .cs de ViewModel desde donde quiero cambiar el fondo de la cuadrícula al hacer clic en el botón. Hasta que llegué a mostrar un MessageBox cuando hice clic …

código .xaml:

     

Código de MainWindowViewModel.cs:

 namespace WpfSimple { class MainWindowViewModel { private ICommand m_ButtonCommand; public ICommand ButtonCommand { get { return m_ButtonCommand; } set { m_ButtonCommand = value; } } public MainWindowViewModel() { ButtonCommand=new RelayCommand(new Action(ChangeBgColor)); } public void ChangeBgColor(object obj) { /*HERE I WANT TO CHANGE GRID COLOR*/ } } } 

Perdón por mi mal ingles.

Atentamente.

En lugar de todo, debe implementar INotifyPropertyChanged en su ViewModel:

 public class MainWindowViewModel : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; // This method is called by the Set accessor of each property. // The CallerMemberName attribute that is applied to the optional propertyName // parameter causes the property name of the caller to be substituted as an argument. private void NotifyPropertyChanged([CallerMemberName] String propertyName = "") { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } } 

Luego, agregue NotifyPropertyChanged () a su configurador de propiedades.

De acuerdo. A continuación, agregue una nueva propiedad con el color de fondo de su cuadrícula a su ViewModel:

 private Brush _gridBackground; public Brush GridBackground { get { return _gridBackground; } set { _gridBackground = value; NotifyPropertyChanged(); } } 

Y une el fondo de tu cuadrícula a tu propiedad:

  

Finalmente, simplemente puedes cambiar GridBackground en el controlador de comandos:

 public void ChangeBgColor(object obj) { GridBackground = Brushes.Blue; } 

Debe recordar que es una mala práctica agregar clases de WPF como Brush a su código. La mejor manera es usar IValueConverter en el código XAML y las clases BCL en su ViewModel. Por ejemplo, puede usar la enumeración en ViewModel y convertirla en pincel en ValueConverter.

  1. Agregue una nueva enumeración para la propiedad de su ViewModel:

     public enum GridState { Valid, Invalid } 
  2. Cambiar el tipo de propiedad:

     private GridState _gridBackground; public GridState GridBackground { get { return _gridBackground; } set { _gridBackground = value; NotifyPropertyChanged(); } } 
  3. Añadir nueva clase con convertidor de valor

     public class GridStateToBackgroundColorConverter : IValueConverter { #region IValueConverter Members public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { GridState val = (GridState) value; if(val == GridState.Valid) return Brushes.Green; return Brushes.Red; } public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { throw new NotSupportedException(); } #endregion } 
  4. Agrega nuevo recurso estático a tu control

         
  5. Actualización de enlace a su propiedad

      

Si desea cambiar el color de fondo de la cuadrícula, puede utilizar el parámetro de comando. Puede pasar cualquier control de UI como parámetro de Comando. En su caso, pase la cuadrícula para acceder a la cuadrícula en su modelo de vista. Dé el nombre a su cuadrícula y use ese nombre para usarlo como parámetro de comando. Para esto necesitas implementar el código así:

        

Después de hacer este cambio en el archivo .xaml. Implemente un comando de retransmisión parametrizada para usar esta cuadrícula pasada para usar en su archivo Viewmodel. Para implementar el comando de retransmisión parametrizado, intente implementar el siguiente código:

  private ICommand m_ButtonCommand; public ICommand ButtonCommand { get { return m_ButtonCommand; } set { m_ButtonCommand = value; } } public MainWindowViewModel() { ButtonCommand=new RelayCommand(ChangeBgColor); } public void ChangeBgColor(Grid grid) { if(grid!=null) grid.Background = Brushes.Red; //Any color you want to change. } 

Espero que esto funcione. Gracias.