2016-05-18 7 views
-1

WPFとMVVMパターンを使用していますが、この場合はあまり関係ありません。プロパティを通じてマルチスレッド中にあるクラスのプロパティを他のクラスから更新する

public int Posts { 
    get { return this.posts; } 
    set { 
     this.posts = value; 
     this.OnPropertyChanged(nameof(this.Posts)); 
    } 
} 

が、私はMainVMFooのリストを提供する:私の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です。 MainVMFooに渡すことは選択できません。だから私は代わりに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されなければならないことだと感じ、なぜ

+0

@Downvoterをどうするかを望んでいる、それはあなたのいいだろう。少なくとも私は改善が必要なことを知っています。 –

答えて

0

私は理解していれば、あなたは...

void Main() 
{ 
    var vm = new MainVM(new FooFactory()); 
    Console.WriteLine(vm.Posts); 
    vm.ExecuteFoo(); 
    Console.WriteLine(vm.Posts);  
} 

public class Foo 
{ 
    private Action _action; 
    public Foo(Action action) 
    { 
     _action = action; 
    } 

    public void RunAction() 
    { 
     _action(); 
    } 
} 

public class FooFactory 
{ 
    public Foo[] CreateFoo(MainVM vm) 
    { 
     return new[] { new Foo(()=>vm.Posts++) }; 
    } 
} 

public class MainVM : INotifyPropertyChanged 
{ 
    public MainVM(FooFactory factory) 
    { 
     _foos = factory.CreateFoo(this); 
    } 

    public void ExecuteFoo() 
    { 
     foreach(var foo in _foos) 
     foo.RunAction(); 
    } 

    private Foo[] _foos; 

    private int posts; 
    public int Posts 
    { 
     get { return this.posts; } 
     set 
     { 
      this.posts = value; 
      this.OnPropertyChanged(); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    private void OnPropertyChanged([CallerMemberName]string propertyName = null) 
    {  
     var local = PropertyChanged; 
     if (local != null) 
     { 
      local(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 
+0

投稿の増分にはロックがありませんか? –

+0

これは単なるサンプルです.fooの作成を渡してモデルのctorを表示する方法です。ロックが高すぎる場合は、増分のみを使用する場合は、インターロッククラスを使用します。 – tym32167

+0

インターロックはintsを正しく使用していますか?プロパティではない? –

関連する問題