WPFとMVVMパターンを使用していますが、この場合はあまり関係ありません。プロパティを通じてマルチスレッド中にあるクラスのプロパティを他のクラスから更新する
public int Posts {
get { return this.posts; }
set {
this.posts = value;
this.OnPropertyChanged(nameof(this.Posts));
}
}
が、私はMainVM
Foo
のリストを提供する:私のViewModel MainVM
では、私はこのような性質を持っています。 (実は、私は、コンストラクタを使用して、それを提供したいが、私は以下をお読みすることはできません。)そして、次のように行いますMainVM
のスタート方法がある:Foo.Bar
の実行で
foreach(Foo foo in this.Foos){ // this.Foos is just a List<Foo>
Task.Run(() => foo.Bar());
}
(ありますが、多くのメソッドがBar
で呼び出されているので、バー自体にAction
を渡すことは実際には実現可能ではありません)、値を更新するはずで、その値はMainVM.Posts
です。 MainVM
をFoo
に渡すことは選択できません。だから私は代わりにAction
を渡すことを考えました。だから私はこのメソッドをMainVM
に書きました。
public void IncrementPosts()
{
lock(this.whatever)
{
this.Posts++;
}
}
は、その後、私はFoo
はコンストラクタでAction
を取りました。ここではFoos
が作成され、MainVM
に渡されます。
var vm = new MainVM();
var foo1 = new Foo(vm.IncrementPosts);
var foo2 = new Foo(vm.IncrementPosts);
vm.Foos = new List<Foo>() {foo1, foo2};
これは機能しますが、私は醜いと感じます。まず、MainVM
はのリストが適切に動作するようにFoo
のリストが必要です。だから、コンストラクタに供給されるはずですよね?しかし、Foo
は、MainVM
のメソッドを指すアクションが必要なので、私はそれを行うことはできません。そして、このすべてはハックのように見えます。
これを行うには良い方法がありますか?あなたはこの質問にコメントしている場合、あなたがdownvotedされなければならないことだと感じ、なぜ
@Downvoterをどうするかを望んでいる、それはあなたのいいだろう。少なくとも私は改善が必要なことを知っています。 –