Обновление привязки TextBlock - PullRequest
0 голосов
/ 03 декабря 2011

Я работаю над приложением WP7, и у меня возникли проблемы с обновлением TextBlock, привязанного к свойству.Я новичок в MVVM и C # в целом, поэтому я не уверен, что делаю не так.

В конце концов, я решил эту проблему, но я не понимаю, почему мое решение работает(всегда весело ...), поэтому я очень ценю ваше руководство.

В модели моего приложения у меня изначально было что-то вроде этого:

// Broken
namespace MyApp.MyModel
{
    public class MetaData : INotifyPropertyChanged
    {
        private StatusType status;
        public StatusType Status
        {
            get { return status; }
            set
            {
                status = value;
                statusMessage = ConvertStatusToSomethingMeaningful(value);
            }
        }

        private string statusMessage;
        public string StatusMessage
        {
            get { return statusMessage; }
            private set
            {
                statusMessage = value;
                // This doesn't work
                NotifyPropertyChanged("StatusMessage");
            }
        }

        ...
    }
}

Status это enum, и когда он установлен моим приложением, он также устанавливает StatusMessage (что является более читабельным описанием, чтобы показать пользователю).TextBlock My View привязан к StatusMessage, но не обновляется с использованием вышеуказанного кода.

Однако, если я переместу NotifyPropertyChanged("StatusMessage") в Status, TextBlock моего View обновится, как этодолжен.Однако я не понимаю, почему это работает, если исходный код выше не работает?

// Fixed
namespace MyApp.MyModel
{
    public class MetaData : INotifyPropertyChanged
    {
        private StatusType status;
        public StatusType Status
        {
            get { return status; }
            set
            {
                status = value;
                StatusMessage = ConvertStatusToSomethingMeaningful(value);
                // This works
                NotifyPropertyChanged("StatusMessage");
            }
        }

        public string StatusMessage { get; private set; }

        ...
    }
}

Заранее большое спасибо за помощь новичку:)

1 Ответ

1 голос
/ 03 декабря 2011

Проблема в этой строке:

 statusMessage = ConvertStatusToSomethingMeaningful(value);

Установщик StatusMessage никогда не вызывается (NotifyPropertyChanged ("StatusMessage") вызывается именно там)

 StatusMessage = ConvertStatusToSomethingMeaningful(value);

будет правильным вызовом

Вероятно, моя реализация этого будет следующей:

 namespace MyApp.MyModel
 {
      public class MetaData : INotifyPropertyChanged
      {
           private StatusType status;
           public StatusType Status
           {
                get { return status; }
                set
                {
                     if (status != value)
                     {
                          status = value;
                          NotifyPropertyChanged("Status");
                          NotifyPropertyChanged("StatusMessage");
                     }                
                }
           }

           public string StatusMessage
           {
                get { return ConvertStatusToSomethingMeaningful(status); }
           }

      ...
      }
 }
...