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:

  1. Tener la casilla de verificación vinculado a los datos en el arranque
  2. Tener la casilla IsChecked cambiar para modificar los datos subyacentes
  3. Haga que la casilla de verificación detectar el cambio de datos subyacente y actualizarse?
¿Fue útil?

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"));

    }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top