WPF: обновление элемента управления со связанным свойством с использованием Model View View-Model - PullRequest
1 голос
/ 26 июня 2009

Я использую шаблон View-Model Model View для приложения WPF. У меня есть ViewModel (устанавливается как DataContext страниц) с двумя свойствами, одним из которых является объект с событием PropertyChanged. В обработчике события я установил значение другого свойства (логическое значение) на некоторое значение.

Теперь свойства Button и TextBox отлично связываются при первой загрузке, а событие PropertyChanged запускается и выполняет свою функцию. Однако свойство IsEnable кнопки не обновляется, чтобы отразить изменение свойства, с которым она связана.

ViewModel выглядит примерно так:

public sealed class CustomerPageViewModel
{ 
    public Customer Customer
    {
        get;
        set;
    }

    public bool Editing
    {
        get;
        private set;
    }   

    private void Customer_PropertyChanged(object sender,
        System.ComponentModel.PropertyChangedEventArgs e)
    {
        Editing = true;
    }
}

И xaml sorta выглядит так:

<TextBox Text="{Binding Customer.Name}" />   
<Button Content="Save Changes" IsEnabled="{Binding Editing}" />

Как я могу заставить Button обновлять ее свойство IsEnable при изменении базового свойства в ViewModel?

Ответы [ 2 ]

4 голосов
/ 26 июня 2009

Это фактический код вашей ViewModel? Если это так, ваша проблема заключается в том, что ваша ViewModel не реализует INotifyPropertyChanged. WPF не может знать, что ваше свойство «Редактирование» ВМ изменилось, поэтому оно не обновляет привязку кнопки.

2 голосов
/ 26 июня 2009

Когда код устанавливает Editing в true, это, по-видимому, не вызывает событие PropertyChanged, поэтому Button понятия не имеет, что должно обновить привязку для IsEnabled. Попробуйте что-то вроде этого:

public sealed class CustomerPageViewModel : INotifyPropertyChanged
{ 
    public Customer Customer
    {
        get;
        set;
    }

    private bool editing = false;
    public bool Editing
    {
        get { return editing; }
        private set
        {
            editing = value;
            Customer_PropertyChanged(this, new PropertyChangedEventArgs("Editing");
        }
    }   

    public event PropertyChangedEventHandler PropertyChanged;
    private void Customer_PropertyChanged(object sender,
        System.ComponentModel.PropertyChangedEventArgs e)
    {
        PropertyChanged(this, e);

        if(!e.PropertyName.Equals("Editing"))
        {
            Editing = true;
        }
    }
}

Обратите внимание, что вы должны убедиться, что Editing не вызвало событие PropertyChanged, иначе вы получите бесконечный цикл.

...