绑定的TextBox文本不会更新

时间:2011-11-01 18:07:40

标签: c# wpf xaml

我在视图中遇到文本框文本更新问题。我见过一些其他线程,但找不到一个接近我的设置。

我有一个类

的模型
    interface IPerson : INotifyPropertyChanged
    {
       string FirstName { get; set;}    
    }

    public class Person
    {
      public event PropertyChangedEventHandler PropertyChanged = delegate { };
      private string _firstName;
      public string FirstName
      { 
           get {return _firstName;}
           set 
           {
             _firstName = value;
             PropertyChanged(this , new PropertChangedEventArgs("FirstName"));
           }
       }
     }

这就是我的viewModel看起来像

    interface IViewModel : INotifyPropertyChanged
    {
      string FirstName { get; set;}
      IPerson Person { get; set; }
    }
    public class viewModel : IViewModel
    {
      public event PropertyChangedEventHandler PropertyChanged = delegate { };
      private IPerson _person;
      public Person Person
      { 
        get {return _person;}
        set 
            {
               _person = value;
                PropertyChanged(this , new PropertyChangedEventArgs("Person"));
            }
       }          
       public string FirstName
       {
          get {return Person.FirstName;}
          Set 
          {
              Person.FirstName = value;
              PropertyChanged(this , new PropertChangedEventArgs("FirstName"));
           }

        }
    }

Xaml绑定设置

// If i use this binding my model will get updated but my textbox text will never show what the value is in the model
Text="{Binding Path=FirstName ,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay,diag:PresentationTraceSources.TraceLevel=High}"

// This binding works fine both ways
Text="{Binding Path=Person.FirstName ,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay,diag:PresentationTraceSources.TraceLevel=High}"

所以,如果我绑定到Person.First Name一切都很好。如果我绑定到FirstName然后它将更新我的模型,但不会获得TextBox文本的数据。当我在列表中选择一个项目时,这一点就变得很明显了。

有没有人知道为什么会这样。我希望能够绑定到ViewModel Firstname,并将它传递给我的person对象。

2 个答案:

答案 0 :(得分:1)

如果您的模型更改了FirsName值,则会触发PropertyChanged事件,但ViewModel不会对其进行扩展(中继)。

要进行第一次绑定工作,ViewModel应该订阅Person.PropertyChanged,然后在嵌套的FirstName更改时引发自己的事件。

但是当然Path=Person.FirstName绑定更可取。

答案 1 :(得分:0)

使用此绑定“Binding Path = Person.FirstName”,View正在侦听您的viewModel以获取PropertyChanged事件。 View不会监听您的模型(即Person)。

如果要将View的DataContext设置为viewModel,那么为了让View了解模型(即人物)的更改,您必须让viewModel监听模型的PropertyChanged事件。然后,从viewModel中提升PropertyChanged事件。