Domanda

Ho semplice problema impostando un'associazione dati a due vie di una casella di controllo in Silverlight 3.0. Deve essere un gioco da ragazzi, ma probabilmente ho dimenticato la mia casa cervello oggi ...

Ho definito una classe modello per rappresentare il mio 'dati' ... Ho implementato l'interfaccia INotifyPropertyChanged per abilitare l'interfaccia utente per vedere quando i dati vengono modificati.

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;
}

Poi ho messo una casella di controllo e un pulsante sulla 'forma' ..:

    <StackPanel Orientation="Horizontal">
        <CheckBox x:Name="check" IsChecked="{Binding Value, Mode=TwoWay}" Content="SomeLabel"/>    
        <Button Click="Button_Click" Content="Test" />
    </StackPanel>

Poi ho fornito i dati nel costruttore:

    public MainPage()
    {
        InitializeComponent();

        this.DataContext = new Model() { Value = true };
    }

Il problema è che si deve cliccare due volte sulla casella di controllo per selezionare / deselezionare meno che de-implementare l'INotifyPropertyChanged. Se de-attuarlo comunque, quindi l'interfaccia utente non si accorge se cambio i dati sottostanti.

Se rimuovo la modalità = bit TwoWay dall'espressione vincolante IsChecked poi anche l'interfaccia utente non si accorga del cambiamento dei dati di base, anche se il modello sta implementando l'interfaccia.

Come posso fare per:

  1. Avere la casella di controllo legata ai dati all'avvio
  2. Avere la casella di controllo IsChecked cambiare per modificare i dati sottostanti
  3. Avere la casella di controllo rilevare la modifica dei dati di base e aggiornare se stesso?
È stato utile?

Soluzione

Hai un errore di sequenziamento nella procedura insieme di proprietà, è necessario assegnare a _value prima notificando la modifica: -

    set
    {
        this._value = value;
        if (this.PropertyChanged != null)
            this.PropertyChanged(this, new PropertyChangedEventArgs("Value"));

    }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top