Silverlight casilla dos vías de enlace no funciona como se esperaba
-
20-09-2019 - |
Pregunta
Tengo tema sencillo el establecimiento de un enlace de datos bidireccional de una casilla de verificación en Silverlight 3.0. Debe ser una obviedad, pero probablemente me olvidó mi hogar cerebro hoy ...
he definido una clase de modelo para representar a mi .. 'datos'. He implementado la interfaz INotifyPropertyChanged para permitir que la interfaz de usuario para ver cuando los cambios de datos.
public class Model : INotifyPropertyChanged
{
private bool _value;
public bool Value
{
get { return this._value; }
set
{
if (this.PropertyChanged != null)
this.PropertyChanged(this, new PropertyChangedEventArgs("Value"));
this._value = value;
}
}
public event PropertyChangedEventHandler PropertyChanged;
}
A continuación pongo una casilla de verificación y un botón en la 'forma' ..:
<StackPanel Orientation="Horizontal">
<CheckBox x:Name="check" IsChecked="{Binding Value, Mode=TwoWay}" Content="SomeLabel"/>
<Button Click="Button_Click" Content="Test" />
</StackPanel>
Entonces los datos suministrados en el constructor:
public MainPage()
{
InitializeComponent();
this.DataContext = new Model() { Value = true };
}
El problema es que usted tiene que hacer doble clic en la casilla para que pueda activar / desactivar a menos que de-implementar el INotifyPropertyChanged. Si des-implementarlo sin embargo, a continuación, la interfaz de usuario no se da cuenta si cambio de los datos subyacentes.
Si quito el Modo = poco TwoWay de la expresión de enlace IsChecked entonces también la interfaz de usuario no notará el cambio de datos subyacente, incluso si el modelo está implementando la interfaz.
¿Cómo puedo hacer para:
- Tener la casilla de verificación vinculado a los datos en el arranque
- Tener la casilla IsChecked cambiar para modificar los datos subyacentes
- Haga que la casilla de verificación detectar el cambio de datos subyacente y actualizarse?
Solución
Usted tiene un error de secuenciación en su conjunto procedimiento de propiedad, es necesario asignar a _value
antes de notificar el cambio: -
set
{
this._value = value;
if (this.PropertyChanged != null)
this.PropertyChanged(this, new PropertyChangedEventArgs("Value"));
}