プロパティを複数のクラスに正しく渡す方法を理解しようとしています。私はちょうど各クラスにINotifyPropertyChanged
を実装し、プロパティの変更を聞くことができることを知っていますが、これはかなりの不必要なコードのようです。プロパティの変更を複数のクラスに伝播する
状況:FilterStatement
(文字列)とFilter
(Filterクラス):
私は2つの依存関係プロパティで(のはClass1
それを呼びましょう)クラスを持っています。文の設定はフィルタに影響を及ぼし、逆も同様です。
ただし、文とフィルタの間の変換ロジックはClass1
ではなく、Class3
にあります。Class1
は直接わかりません。その間には、変更を通過するだけのClass2
があります。 (実際の状況では完全には一致しませんが、クラス1〜3のViewModel、モデル、リポジトリを想像することができます)。
public class Class1
{
public static readonly DependencyProperty FilterProperty = DependencyProperty.Register(
"Filter",
typeof(Filter),
typeof(Class1),
new FrameworkPropertyMetadata(null));
public static readonly DependencyProperty FilterStatementProperty = DependencyProperty.Register(
"FilterStatement",
typeof(String),
typeof(Class1),
new FrameworkPropertyMetadata(null));
public Filter Filter
{
get { return (Filter)GetValue(FilterProperty); }
set { SetValue(FilterProperty, value); }
}
public string FilterStatement
{
get { return (string)GetValue(FilterStatementProperty); }
set { SetValue(FilterStatementProperty, value); }
}
public Class2 MyClass2Instance { get; set; }
}
public class Class2
{
public Class3 MyClass3Instance { get; set; }
public void ChangeClass3Instance(object someParam) {
... // this can change the instance of MyClass3Instance and is called frome somewhere else
// when changed, the new Class3 instance has to get the property values of Class1
}
}
public class Class3
{
private Filter _filter; // here is where the filter set in Class 1 or determined by the statement set in class 1 has to be put
public string MyFilterToStatementConversionMemberFunction(Filter filter)
{
...
}
public Filter MyStatementToFilterConversionMemberFunction(string statement)
{
...
}
}
私の素朴な解決策は、すべての3つのクラス間での特性を複製Class2
とClass3
でINotifyPropertyChanged
を実装し、Class3
まで、バックClass1
までの結果ですべてを伝播し、変化に耳を傾けることであろう。これには良い解決策はありませんか?
MVVMライトのようなメッセンジャーを使用できませんか?お互いを知る必要のないVM間でプロパティの変更を通知できるように設計されています。 – Keithin8a
私は現在1つを使用していません。これを使うのは避けたいのですが、解決策になりそうです。 –
なぜ私は私がコメントを投稿すると思ったのですか?答え。あなたが正しいことをやっていないという道を歩いている可能性があるように見えるのは、より良い方法があると思うからです。しかし、あなたは自分のプロジェクトを私よりもよく知っているので、理由があると確信しています;ちょっと注意してください;) – Keithin8a