2012-02-16 4 views
1

내 멀티 스레드 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가 업데이트되지 않습니다. 내 질문은 :

  1. 나는 {바인딩 경로 = Model.DbState}처럼 뷰 모델 및 바인드 뷰 모델 공개 속성을 추가해야 하는가? 나는 그것이 MVVM 아이디어를 혼란스럽게한다고 생각한다.

  2. UI의 사용자 클릭 버튼을 클릭하면 새로운 스레드에서 ShallowModel의 InObject가 생성됩니다. 따라서 ViewModel을 만들 때 InObject는 null입니다. 어떻게 든 - 스레드에 의해 생성 된 후 - ActObjectState가 업데이트되지 않습니다. 어떻게 작동 시키는가? {Binding Path = Model.InObject.ActState}와 같은 바인딩을 만드시겠습니까? 이는 UI 디자이너가 모델에 대한 지식을 가질 필요가 있음을 의미합니다. 대한

들으, SRY 내 스레드 당신이 뷰 모델에 그와 관련된 모든 속성을 인상하는 데 필요한 ShallowModel을 만들어

+0

이 확실히 당신을 도울 것을 알고 있다고 생각 [상속에서 INotifyPropertyChanged] [1] [1] : http://stackoverflow.com/ 질문/6871952/silverlight-checkbox-results –

+0

정확하게 무엇을 추천하는지 잘 모르겠습니다. 전체 INotifyPropertyChanged 인터페이스가 구현되었습니다. ViewModel에서도 사용되어야합니다. ViewModel에 의해 이러한 속성이 설정되지는 않지만 모델은 백그라운드 스레드의 동작 결과로 설정됩니다. – Joe

+0

잘못된 코드가 모두 표시됩니다. 문제는 바인딩 된 속성으로 UI를 업데이트하는 것이지만 INotifyPropertyChanged 구현을 표시하지 않습니다. 백그라운드 스레드가 이러한 속성을 업데이트하고 있지만 코드를 표시하지 않는다고 말합니다. –

답변

0

나는 당신의 제안을 받아 들일 것이다. 그것의 가장 쉬운 방법은 MVVM 패턴의 위반을 보지 않는다.

이 기능이 작동하지 않는다면보기 관련 로직을 viewmodel에 넣어야합니다. viewmodel이 모델의 변경 사항을 듣고 (보기 관련 로직을 사용하여) 뷰에 대한 이러한 변경 사항을 다시 게시해야 할 수도 있습니다.

디스패처 물건을 인식 스레드 작업,하지만 난 당신이

+0

디스패처를 사용하고 필요한 경우 호출합니다. 고마워. 모델로 업데이트 할 UI가 필요합니다. 그래서 일부 모델 논리를 viewmodel에 넣을 수 있고 그것이 효과가있을 것입니다. 내 제안은 내게 더러운 것 같아. – Joe

+0

결국 나는 아이디어가 부족하기 때문에 (또는 Anton Tykhyy가 쓰고있는 것처럼 sth를 구현할 시간) 제 제안 # 1을 취했습니다. 여러분 모두 고맙습니다. – Joe

0

경우 영어. String.Empty을 올리면 바인딩 된 모든 속성을 가져 오도록 데이터 바인딩 엔진에 알릴 수 있습니다. 하지만 스레드에 있기 때문에 그냥 PropertyChangedEvent을 실행하면 UI 스레드가 처리 할 수 ​​있으므로 호출해야합니다. 우리가 한 일은 dispatcher으로 Raise Method를 스레드로부터 안전하게 만드는 것이 었습니다.

+0

사실 ShallowObject가 ViewModel로 전달됩니다. InsideObject는 스레드에 의해 생성됩니다. 예외는 없습니다. 그것은 단지 업데이트가 아닙니다. 몇 가지 답변을 기다리는 동안 - 모든 프로세스가 UI 스레드에 의해 수행되는 간단한 응용 프로그램을 만들었습니다. 그것은 작동하지 않았다. || ViewModel의 속성을'String.Empty'로 설정한다는 뜻입니까? – Joe

+0

@Joe 그냥 작은 ... 이건 Typo입니까? AstState ! = ActState. – dowhilefor

+0

네, 죄송합니다. 수정 됨. – Joe

관련 문제