내 멀티 스레드 WPF 응용 프로그램에서 MVVM 패턴을 사용합니다.배경에서 작업하는 스레드에 의해 생성 된 객체의 속성에 바인딩
<TextBlock Text={Binding ActObjectState}/>
<TextBlock Text={Binding DbState}/>
지금 거기 :
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을 말해봐 :
지금 모델에서 나는 (내가 좀 더 명확하게하기에서 INotifyPropertyChanged 인터페이스의 명백한 이행을 생략) 한 문제가되는 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;
}
}
}
문제는 ActObjectSta 배경 스레드가 ShallowModel 및/또는 InsideModel의 속성을 업데이트 할 때 te 및 DbState가 업데이트되지 않습니다. 내 질문은 :
나는 {바인딩 경로 = Model.DbState}처럼 뷰 모델 및 바인드 뷰 모델 공개 속성을 추가해야 하는가? 나는 그것이 MVVM 아이디어를 혼란스럽게한다고 생각한다.
UI의 사용자 클릭 버튼을 클릭하면 새로운 스레드에서 ShallowModel의 InObject가 생성됩니다. 따라서 ViewModel을 만들 때 InObject는 null입니다. 어떻게 든 - 스레드에 의해 생성 된 후 - ActObjectState가 업데이트되지 않습니다. 어떻게 작동 시키는가? {Binding Path = Model.InObject.ActState}와 같은 바인딩을 만드시겠습니까? 이는 UI 디자이너가 모델에 대한 지식을 가질 필요가 있음을 의미합니다. 대한
들으, SRY 내 스레드 당신이 뷰 모델에 그와 관련된 모든 속성을 인상하는 데 필요한 ShallowModel을 만들어
이 확실히 당신을 도울 것을 알고 있다고 생각 [상속에서 INotifyPropertyChanged] [1] [1] : http://stackoverflow.com/ 질문/6871952/silverlight-checkbox-results –
정확하게 무엇을 추천하는지 잘 모르겠습니다. 전체 INotifyPropertyChanged 인터페이스가 구현되었습니다. ViewModel에서도 사용되어야합니다. ViewModel에 의해 이러한 속성이 설정되지는 않지만 모델은 백그라운드 스레드의 동작 결과로 설정됩니다. – Joe
잘못된 코드가 모두 표시됩니다. 문제는 바인딩 된 속성으로 UI를 업데이트하는 것이지만 INotifyPropertyChanged 구현을 표시하지 않습니다. 백그라운드 스레드가 이러한 속성을 업데이트하고 있지만 코드를 표시하지 않는다고 말합니다. –