C # WPF MVVM Значение TextBox не изменяется - PullRequest
3 голосов
/ 11 августа 2011

Я новичок в использовании MVVM в WPF и обнаружил, что невозможно изменить значение текстового поля или метки. Вот пример.

В Xaml:

Первоначальное значение имени "Питер".

Но после того, как я нажму кнопку, которая вызовет команду во ViewModel и изменит значение Name на «Джон». Итак, предположим, что значение текстового поля также будет изменено на John. Однако это не изменится.

Я нашел много примеров в сети и обнаружил, что ни одна из них не реализовала такого рода функции. То, что я узнал от них, это использовать Command и ItemsSource из ListView. Значение ListView изменится, когда я использую кнопку, чтобы поднять команду для изменения ItemsSource представления. Его значение изменится автоматически при изменении Binding to ItemsSource.

Однако я не могу изменить значение TextBox или Label, даже если значение привязки к ним уже изменилось.

На самом деле, я очень молод в MVVM. Я думаю, что у меня все еще так много, что я не знаю. Не могли бы вы привести пример того, как именно я должен сделать, чтобы изменить текстовое поле после нажатия кнопки? Кстати, я не совсем уверен, как сделать команду для кнопки. Кажется, в нем так много кодов, которые я нашел в примере из сети. Есть ли более простой способ?

Большое спасибо.

Ответы [ 2 ]

3 голосов
/ 11 августа 2011

Ваша ViewModel должна реализовать INotifyPropertyChanged.Документация см. здесь

public class Bar : INotifyPropertyChanged
{
  public event PropertyChangedEventHandler PropertyChanged;
  private string foo;
  public string Foo 
  {
    get { return this.foo; }
    set 
    { 
      if(value==this.foo) 
        return;
      this.foo = value;
      this.OnPropertyChanged("Foo");
    }
  }
  private void OnPropertyChanged(string propertyName)
  {
    if(this.PropertyChanged!=null)
      this.PropertyChanged(this,new PropertyChangedEventArgs(propertyName));
  }  
}
1 голос
/ 11 августа 2011

Ваша модель представления должна реализовывать INotifyPropertyChanged , чтобы WPF знал, что вы изменили значение свойства.

Вот пример из

// This is a simple customer class that 
// implements the IPropertyChange interface.
public class DemoCustomer  : INotifyPropertyChanged
{
    // These fields hold the values for the public properties.
    private string customerNameValue = String.Empty;

    public event PropertyChangedEventHandler PropertyChanged;

    private void NotifyPropertyChanged(String info)
    {
        var listeners = PropertyChanged;
        if (listeners  != null) 
        {
            PropertyChanged(this, new PropertyChangedEventArgs(info));
        }
    }

    public string CustomerName
    {
        get
        {
            return this.customerNameValue;
        }

        set
        {
            if (value != this.customerNameValue)
            {
                this.customerNameValue = value;
                NotifyPropertyChanged("CustomerName");
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...