2011-08-11 2 views
3

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

В Xaml:

Исходное значение Имя является "Питер".

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

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

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

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

спасибо.

+2

реализовать ли ваш ViewModel 'INotifyPropertyChanged'? –

+0

+1 Stephan Я рекомендую вам написать это, поскольку это, вероятно, ответ. –

+0

Большое вам спасибо! Я действительно этого не делал. – user883434

ответ

3

Ваш ViewModel необходимо реализовать INotifyPropertyChanged. документации см here

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)); 
    } 
} 
+0

Привет, ребята, я уже включил пространство имен System.ComponentModel, но ключевое слово PropertyChanged все еще находится в черном цвете. Зачем? – user883434

+0

'ProertyChanged' - это имя события, которое определено в' INotifyPropertyChanged'. Вам необходимо реализовать этот интерфейс. Я обновил свой ответ и добавил объявление события. –

+0

Вышеупомянутый код добавлен в ViewModel? – user883434

1

Ваше мнение модель должна реализовать 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"); 
      } 
     } 
    } 
} 
+0

Добавить этот код в ViewModel? Должен ли я добавить что-нибудь в PropertyChanged? нужно ли еще сделать, чтобы это работало? – user883434

Смежные вопросы