私はマルチスレッドWPFアプリケーションでMVVMパターンを使用します。スレッドで作成されたオブジェクトのプロパティへのバインド
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")
}
}
}
は私が見るにテキストブロックを持っていると言う:
<TextBlock Text={Binding ActObjectState}/>
<TextBlock Text={Binding DbState}/>
今があります、私は(私はそれがより明確にするために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バインディングのパス}のようにViewModelにバインドビューにモデルのパブリックプロパティを追加すべきか?私はそれがMVVMのアイデアを混乱させると思う - ビューはモデルについて知っているべきではない。
InObject in ShallowModelは、UI上のユーザークリックボタンの後に新しいスレッドによって作成されます。したがって、ViewModelが作成されるとき、InObjectはnullです。何とか - スレッドによって作成された後 - ActObjectStateは更新されません。それを動作させるには? {Binding Path = Model.InObject.ActState}のようなバインディングを作成しますか?これは、UIデザイナーによるモデルに関する知識を必要とすることを意味します。
Thxを、私の英語
これは間違いなくあなたを助ける必要があることを知っていると思う[継承INotifyPropertyChangedの] [1] [1]:http://stackoverflow.com/質問/ 6871952/silverlight-checkbox-results –
あなたは何を正確に参照しているのか分かりません。全体のINotifyPropertyChangedインタフェースが実装されています。これらのプロパティがViewModelではなくModelで設定されていても、ViewModelでも使用する必要があります。両方ともバックグラウンドスレッドのアクションの結果として設定されます。 – Joe
間違ったコードがすべて表示されています。あなたの問題は、バインドされたプロパティでUIを更新することですが、INotifyPropertyChangedの実装は表示されません。バックグラウンドスレッドがこれらのプロパティを更新しているのに、コードを表示していないとします。 –