Двусторонняя привязка флажка Silverlight работает не так, как ожидалось

StackOverflow https://stackoverflow.com/questions/1361783

Вопрос

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

Я определил класс модели для представления моего .."данные".Я реализовал интерфейс 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 binding, то пользовательский интерфейс также не заметит изменения базовых данных, даже если Модель реализует интерфейс.

Как я могу сделать, чтобы :

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

Решение

У вас ошибка последовательности в вашей процедуре set property, вам нужно назначить _value до того , как уведомление об изменении :-

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

    }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top