Привязка к свойству объекта, созданного потоком, работающим на фоне - PullRequest
1 голос
/ 16 февраля 2012

Я использую шаблон MVVM в своем многопоточном приложении WPF.

Теперь в модели, которую я имею (я пропустил очевидную реализацию интерфейса INotifyPropertyChanged, чтобы сделать его более понятным):

public class ShallowModel : INotifyPropertyChanged
{
  private string _dbState;
  public string DbState
  {
     get { return _dbState; }
     set 
     { 
       _dbState = value;
       OnPropertyChanged("DbState") // ofc there is implementation of this
     }
  }
  private InsideObject _inObject;
  public InsideObject InObject
  {
     get { return _inObject; }
     set 
     { 
       _inObject = value;
       OnPropertyChanged("InObject") 
     }
  }
}   

public class InsideModel : INotifyPropertyChanged
{
  private string _actState;
  public string ActState
  {
     get { return _actState; }
     set 
     { 
       _actState= value;
       OnPropertyChanged("ActState")
     }
  }
}

Скажем, у меня есть TextBlocks в представлении:

<TextBlock Text={Binding ActObjectState}/>
<TextBlock Text={Binding DbState}/>

Теперь есть часть проблемного ViewModel:

public class ViewModel : INotifyPropertyChanged
{
  private ShallowModel _model;
  public string ActObjectState
  {
     get 
     { 
       if(_model.InObject != null)
         return _model.InObject.ActState; 
       else
         return null;
     }
  }
  public string DbState
  {
     get 
     { 
       return _model.DbState;
     }
  }
}

Проблема в том, что ActObjectState и DbState не обновляются, когда фоновый поток обновляет свойства ShallowModel и / или InsideModel.Мои вопросы:

  1. Должен ли я добавить открытое свойство Model в ViewModel и связать представление, как {Binding Path = Model.DbState} ?Я думаю, что это нарушает идею MVVM - представление не должно знать о модели.

  2. InObject в ShallowModel создается новым потоком после нажатия кнопки пользователя на пользовательском интерфейсе.Поэтому, когда ViewModel создан, InObject равен нулю.Каким-то образом - после того, как он создан потоком - ActObjectState не обновляется.Как заставить это работать?Сделать привязку как {Binding Path = Model.InObject.ActState}?Это подразумевает необходимость обладать знаниями о Model от дизайнера пользовательского интерфейса.

Спасибо за мой английский

Ответы [ 2 ]

0 голосов
/ 16 февраля 2012

Я бы принял ваше предложение 1. Это самый простой способ, и я не вижу никаких нарушений паттерна MVVM.

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

при работе с потоками помните о вещах диспетчера, но я думаю, вы знаетечто

0 голосов
/ 16 февраля 2012

Если ваш поток создал ShallowModel, вам нужно поднять все свойства, связанные с этим в viewmodel. Вы можете поднять String.Empty, чтобы заставить механизм привязки данных извлекать все связанные свойства. Но поскольку вы находитесь в потоке, вы не можете просто запустить PropertyChangedEvent, вам нужно отправить его, чтобы поток пользовательского интерфейса мог с ним справиться. То, что мы сделали, - это сделали поток интерфейса Raise Method безопасным с помощью диспетчера .

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