Pergunta

Tenho um problema simples de definir um banco de dados bidirecional de uma caixa de seleção no Silverlight 3.0. Deve ser um acéfalo, mas provavelmente esqueci meu cérebro hoje ...

Eu defini uma classe modelo para representar meus .. 'dados'. Implementei a interface InotifyPropertyChanged para permitir que a interface do usuário veja quando os dados mudam.

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

Em seguida, coloquei uma caixa de seleção e um botão no .. 'formulário':

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

Então eu forneci os dados no construtor:

    public MainPage()
    {
        InitializeComponent();

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

O problema é que você deve clicar duas vezes na caixa de seleção para verificar/desmarcar, a menos que eu desconfie o InotifyPropertyChanged. Se o desligamento, no entanto, a interface do usuário não perceberá se eu alterar os dados subjacentes.

Se eu remover o bit mode = twoway da expressão de ligação isquecada, também a interface do usuário não notará a mudança de dados subjacente, mesmo que o modelo esteja implementando a interface.

Como posso fazer para:

  1. Tenha a caixa de seleção ligada aos dados na inicialização
  2. Peça à alteração iscatada da caixa de seleção para modificar os dados subjacentes
  3. A caixa de seleção detecta a mudança de dados subjacentes e a própria atualização?
Foi útil?

Solução

Você tem um erro de seqüenciamento em seu procedimento de propriedade definido, você precisa atribuir a _value antes da notificando a mudança:-

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

    }
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top