これと同様の質問に対するいくつかの回答を見てきましたが、私が考えている特定のパラダイムがC#でも可能であるかどうかは疑問でした。まず、私は問題をレイアウトします:簡単にWPFのUIに通知を伝播
私はC#で開発しているMVVMアプリケーションを持っています。モデルにはプロパティが変更されており、モデル内で単一のプロパティが変更されると、ビューモデルの複数のプロパティに影響することがあります。したがって、ビュー・モデルはモデルの変更をリッスンします。ビューはビューモデルの変更をリッスンします。それだけで厄介そうなので
private void OnModelPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
string prop_name = e.PropertyName;
if (prop_name.Equals("some_property_on_the_model"))
{
NotifyPropertyChanged("some_property_on_the_view_model");
NotifyPropertyChanged("some_property_on_the_view_model");
NotifyPropertyChanged("some_property_on_the_view_model");
NotifyPropertyChanged("some_property_on_the_view_model");
NotifyPropertyChanged("some_property_on_the_view_model");
}
else if (...)
{
... etc ...
}
}
これは厄介な取得します。私の見解・モデルでは
は、私はこのようになりますいくつかのコードを取得してしまいます。ビューモデルに新しいプロパティを追加した後でこの関数を編集することを忘れた場合、バグが発生しやすくなります。
ここで私はのようにのようにしていますが、これが可能かどうかはわかりません。だから私は可能かどうかを理解するのを手伝っていただきたいと思います。
C#の「属性」機能を使用してプロパティの変更された伝播を処理することができれば、本当にクールです。
そのため、おそらくこのような何か:
[ListenToModelProperty("some_property_on_the_model")]
[OnPropertyChanged("MyButtonVisibility")]
public Visibility MyButtonVisibility
{
get
{
if (model.some_property_on_the_model == true)
{
return Visibility.Visible;
}
else
{
return Visibility.Hidden;
}
}
}
private void OnModelPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
prop_name = e.PropertyName;
foreach (var property in view_model)
{
var attributes = property.GetCustomAttributes(typeof(ListenToModelPropertyAttribute));
var descriptions = attributes.Select(x => x.Description);
if (descriptions.Contains(prop_name))
{
notification_to_make = property.GetCustomAttributes(typeof(OnPropertyChangedAttribute));
string notification_string = notification_to_make[0].Description;
NotifyPropertyChanged(notification_string);
}
}
}
は、上記のコードは、実際のコードであることを意味するものではないことに注意してください。それは間違いなくコンパイルされず、動作しません。しかし、私は上記のようなものがC#で可能かどうかを見たいと思います。属性を使ってこれを行うことは可能ですか?それとも、このようなことを可能にするライブラリがありますか?
これはしばしば私たちのチームの頭痛です。 Fody PropertyChangedには、この問題を少しずつ違う方法で解決しようとしています。 https://github.com/Fody/PropertyChanged。私は個人的には生産でそれを試していない! – Rowbear