Связанный текст TextBox не обновляется - PullRequest
0 голосов
/ 01 ноября 2011

У меня проблема с обновлением текста в текстовом поле, на мой взгляд.Я видел некоторые другие темы, но не могу найти ту, которая близка к моей настройке.

У меня есть модель с классом

    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"));
           }
       }
     }

Вот так выглядит моя модель представления

    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 Text.Это становится очевидным, когда я выбираю элемент в своем списке.

У кого-нибудь есть идеи, почему это произойдет.Я хочу иметь возможность связываться с именем ViewModel и просто передать его моему объекту person.

Ответы [ 2 ]

1 голос
/ 01 ноября 2011

Если ваша модель изменяет значение FirsName, она вызывает событие PropertyChanged, но оно не расширяется (ретранслируется) с помощью ViewModel.

Чтобы первая привязка работала, ваша ViewModel должна подписаться на Person.PropertyChanged, а затем вызвать собственное событие при изменении вложенного FirstName.

Но, конечно, привязка Path=Person.FirstName предпочтительнее в любом случае.

0 голосов
/ 01 ноября 2011

С этой привязкой «Binding Path = Person.FirstName» представление прослушивает вашу viewModel для события PropertyChanged. Вид не слушает вашу модель (т.е. человека).

Если вы устанавливаете DataContext вашего View в viewModel, то для того, чтобы View узнал об изменениях в вашей модели (то есть человеке), вам нужно будет, чтобы ваш viewModel прослушивал событие PropertyChanged вашей модели. , Затем создайте событие PropertyChanged из вашей viewModel.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...