Флажок Silverlight двусторонняя привязка не работает должным образом - PullRequest
2 голосов
/ 01 сентября 2009

У меня есть простая проблема, устанавливающая двустороннюю привязку данных флажка в Silverlight 3.0. Это должно быть легко, но, вероятно, я забыл свой мозг сегодня ...

Я определил класс Model для представления моих .. 'data'. Я реализовал интерфейс INotifyPropertyChanged, чтобы пользовательский интерфейс мог видеть, когда данные изменяются.

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

Затем я ставлю флажок и кнопку на «форму»:

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

Затем я предоставил данные в конструкторе:

    public MainPage()
    {
        InitializeComponent();

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

Проблема заключается в том, что вам нужно дважды щелкнуть по флажку, чтобы включить / выключить его, если я не деинсталлирую INotifyPropertyChanged. Однако, если де-реализовать его, пользовательский интерфейс не заметит, если я изменю базовые данные.

Если я удаляю бит Mode = TwoWay из выражения привязки IsChecked, пользовательский интерфейс также не заметит изменения в базовых данных, даже если Модель реализует интерфейс.

Как мне сделать:

  1. Установите флажок, связанный с данными при запуске
  2. Установите флажок IsChecked, чтобы изменить базовые данные
  3. Установлен ли флажок для определения изменений основных данных и само обновление?

1 Ответ

8 голосов
/ 01 сентября 2009

В процедуре заданного свойства возникла ошибка последовательности, которую необходимо присвоить _value до уведомления об изменении: -

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

    }
...