2015-03-26 7 views
1

Я новичок в WPF MVVM; поэтому, это очень простая тестовая программа, подвергая проблеме обновления TextBox. Ссылаясь на приведенный ниже код, проверка CheckBox (Name = "view1TextBox1" в View1.xml) вызывает свойство ViewModel1BoolField1 (ViewModel1.cs), в котором вызывается RunTest (Model1.cs). Затем RunTest возвращает строку (ViewModel1.cs). Затем эта строка присваивается свойству ViewModel1StringField1. Здесь возникает проблема, поскольку TextBox view1TextBox1 (View.xml) не обновляется тестовой строкой «Тестирование 123». Я не уверен, правильно ли я использую «OnPropertyChanged» (ViewModelBase.cs) или view1TextBox1 «UpdateSourceTrigger = PropertyChanged» (View1.xml) для обновления TextBox. Любое понимание было бы здорово. Благодаря!Обновление WPF MVVM TextBox не происходит

<UserControl x:Class="WpfMVVMExample1.View.View1" 
       xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
       xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
       xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
       xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
       mc:Ignorable="d" 
       d:DesignHeight="300" d:DesignWidth="300"> 
     <StackPanel Orientation="Vertical"> 
      <TextBox Width="100" Height="100" Name="view1TextBox1" TextWrapping="Wrap" AcceptsReturn="True" Text="{Binding ViewModel1StringField1, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/> 
      <CheckBox Name="view1CheckBox1" IsChecked="{Binding ViewModel1BoolField1}"/> 
     </StackPanel> 
    </UserControl> 

namespace WpfMVVMExample1.ViewModel 
{ 
    public abstract class ViewModelBase : INotifyPropertyChanged, IDisposable 
    { 
     public event PropertyChangedEventHandler PropertyChanged; 

     protected virtual void OnPropertyChanged(string propertyName) 
     { 
      PropertyChangedEventHandler handler = this.PropertyChanged; 
      if (handler != null) 
      { 
       var e = new PropertyChangedEventArgs(propertyName); 
       handler(this, e); 
      } 
     } 

     public void Dispose() 
     { 
      this.OnDispose(); 
     } 

     protected virtual void OnDispose() 
     { 
     } 
    } 
} 

namespace WpfMVVMExample1.ViewModel 
{ 
    class ViewModel1 : ViewModelBase 
    { 
     #region Fields 
     Model1 _model1; 
     #endregion 

     #region Constructors 
     public ViewModel1() 
     { 
      _model1 = new Model1 { Model1StringField1 = "Field1" }; 
     } 
     #endregion 

     #region Properties 

     public Model1 Model1 
     { 
      set 
      { 
       _model1 = value; 
      } 
      get 
      { 
       return _model1; 
      } 
     } 

     public string ViewModel1StringField1 
     { 
      get 
      { 
       return Model1.Model1StringField1; 
      } 

      set 
      { 
       Model1.Model1StringField1 = value; 
       OnPropertyChanged(ViewModel1StringField1); 
      } 
     } 

     public bool ViewModel1BoolField1 
     { 
      get 
      { 
       return Model1.Model1BoolField1; 
      } 
      set 
      { 
       Model1.Model1BoolField1 = value; 
       if (value) 
       { 
        ViewModel1StringField1 = Model1.RunTest(); 
       } 
      } 
     }   
     #endregion 
    } 
} 

namespace WpfMVVMExample1.Model 
{ 
    class Model1 
    { 
     #region Fields 
     string _model1StringField1; 
     bool _model1BoolField1; 
     #endregion 

     #region Properties 
     public string Model1StringField1 
     { 
      get 
      { 
       return _model1StringField1; 
      } 
      set 
      { 
       _model1StringField1 = value; 
      } 
     } 

     public bool Model1BoolField1 
     { 
      get 
      { 
       return _model1BoolField1; 
      } 
      set 
      { 
       _model1BoolField1 = value; 
      } 
     } 
     #endregion 

     #region Functions 
     public string RunTest() 
     { 
      return "Testing 123"; 
     } 
     #endregion 
    } 
} 

ответ

2

Когда вы вызываете измененное свойство, вы должны передать измененное имя свойства. В настоящее время вы передаете значение свойства.

OnPropertyChanged(ViewModel1StringField1); } 

Должно быть

OnPropertyChanged("ViewModel1StringField1"); } 
1

Если вы посмотрите на ViewModelBase класс, вы увидите этот метод подписи:

protected virtual void OnPropertyChanged(string propertyName) 

Параметр этого метода является имя свойства это изменилось. Однако, когда вы вызываете его в ViewModel1StringField1 сеттер, вы делаете это:.

OnPropertyChanged(ViewModel1StringField1); 

Вместо имени свойства, вы передаете в его стоимости, которая может быть что угодно пользователю положить в Вместо этого, вы хотите сделать это:

OnPropertyChanged("ViewModel1StringField1"); 

недостатком является то, что имя свойства теперь строка и не будет проверяться компилятором при изменении имени свойства. Поэтому просто будьте осторожны (альтернативные способы сделать это).

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