ejemplo - raise event on property change c#
¿Cómo funciona WPF INotifyPropertyChanged? (1)
Esta es una implementación típica de INotifyPropertyChanged para usar Binding en WPF / C #.
namespace notifications.ViewModel
{
class MainViewModel : INotifyPropertyChanged
{
public const string NamePropertyName = "CheckBoxState";
private bool _checkboxstate = true;
public bool CheckBoxState
{
get { return _checkboxstate; }
set
{
if (_checkboxstate == value) return;
_checkboxstate = value;
RaisePropertyChanged(NamePropertyName);
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void RaisePropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
}
También tengo un código XAML que tiene un enlace a CheckBoxState
.
<Grid>
<StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
<CheckBox Content="Click Me" IsChecked="{Binding Path=CheckBoxState, Mode=TwoWay}" />
<TextBlock Text="{Binding Path=CheckBoxState, Mode=TwoWay}" />
</StackPanel>
</Grid>
Este es el MainWindow.xaml.cs para vincular entre el DataContext y el modelo.
public partial class MainWindow : Window
{
notifications.ViewModel.MainViewModel model = new notifications.ViewModel.MainViewModel();
public MainWindow()
{
InitializeComponent();
this.DataContext = model;
}
}
Cuando el usuario establece la casilla de verificación, creo que lo que sucedería es el siguiente: IsChecked
convierte en verdadero, y con "{Binding Path=CheckBoxState, Mode=TwoWay}"
, la propiedad CheckBoxState
vuelve verdadera para llamar a RaisePropertyChanged()
y, en consecuencia, PropertyChanged()
. Como el parámetro para esta función es CheckBoxState
, se notifica a cada enlace con Path CheckBoxState
para que se actualice.
- ¿Cómo se activa esta llamada
<TextBlock Text="{Binding Path=CheckBoxState, Mode=TwoWay}" />
? ¿Cuál es la magia de los C # detrás de esto para hacerlo posible? - ¿Por qué es necesario
if (PropertyChanged != null)
? ¿Quién configura el PropertyChanged a qué valor? - El significado de
Mode=TwoWay
parece que no solo puede señalar el cambio, sino que también actualiza el contenido cuando otro elemento de Enlace con el mismo nombre en el enlace cambia, entonces, ¿qué pasa con el modo OneWay? ¿Podemos establecer un enlace como fuente o destino solamente?
¿Cómo se activa esta llamada? ¿Cuál es la magia de los C # detrás de esto para hacerlo posible?
Este código crea un objeto de enlace que vincula la propiedad TextBlock''s Text a la propiedad ViewModel. También agrega un controlador de eventos al evento PropertyChanged de ViewModel para actualizar el valor del texto cuando ViewModel activa el evento PropertyChanged (con la propiedad correcta).
¿Por qué es necesario
if (PropertyChanged != null)
? ¿Quién configura el PropertyChanged a qué valor?
Si el evento PropertyChanged es nulo, su activación provocará una NullReferenceException.
El significado de
Mode=TwoWay
parece que no solo puede señalar el cambio, sino que también actualiza el contenido cuando otro elemento de Enlace con el mismo nombre en el enlace cambia, entonces, ¿qué pasa con el modo OneWay? ¿Podemos establecer un enlace como fuente o destino solamente?
Los modos de enlace son:
- TwoWay: Cambia el valor límite cuando la propiedad ViewModel cambia y viceversa
- OneWay: cambia el valor enlazado cuando la propiedad ViewModel cambia solo
- OneWayToSource: cambia la propiedad ViewModel cuando el valor enlazado cambia solo
- OneTime: establece el valor límite en el valor de la propiedad ViewModel justo cuando se crea la aplicación o cambia el contexto de los datos.
Puede leer más sobre ellos aquí: http://msdn.microsoft.com/en-us/library/system.windows.data.bindingmode.aspx