2017-09-11 7 views
1

ツリーのどのサブレベルでもプロパティの変更を観察するにはどうすればよいですか?Rx.NET/ReactiveUIでのツリーの操作

たとえば、NameおよびChildNodesのプロパティを持つクラスTreeNodeを考えてみましょう。 TreeNodeのサブレベルでNameの変更を確認するにはどうすればよいですか?私が書いたように、私は、DLLのバージョンの問題になってしまった - 私はあなたのコードを実行するために得ることができませんでした

// NuGet: Install-Package reactiveui 
// In case of Splat version issue: Install-Package Splat -Version 1.6.2 
using ReactiveUI; 

public class TreeNode: ReactiveObject 
{ 
    public string Name 
    { 
     get { return this._name; } 
     set { this.RaiseAndSetIfChanged(ref this._name, value); } 
    } 
    private string _name = ""; 

    public ReactiveList<TreeNode> ChildNodes 
    { 
     get { return this._childNodes; } 
     set { this.RaiseAndSetIfChanged(ref this._childNodes, value); } 
    } 
    private ReactiveList<TreeNode> _childNodes = new ReactiveList<TreeNode>(); 
} 
+0

'TreeNode'と任意のサポートクラスの完全なクラス定義を提供してください。できるだけ簡単に回答してください。 – Enigmativity

+1

彼らは完全に私にとって重要です。あなたが具体的なクラスを提供できるなら、あなたは人々に答えるようになるでしょう。それ以外の場合は、システムの設計を依頼しています。それは大変な作業です。私が言ったように、あなたは私たちが答えるためにこれをできるだけ簡単にするべきです。 – Enigmativity

+0

'RaiseAndSetIfChanged'とは何ですか?私はあなたのコードをコピー、ペースト、コンパイルしようとしています。 – Enigmativity

答えて

1

rootNode.FlattenTreeToObservable(x => x.ChildNodes) 
     .WhenAnyValue(x => x.Name) 
     .Subscribe(...) 

のTreeNode例:

使い方は次のようになります。あなたと同じ構造を使用してこれを動作させる基本クラス:

public class TreeNode 
{ 
    public string Name { get; set; } 

    public Subject<TreeNode> ChildNodes { get; } 
     = new Subject<TreeNode>(); 
} 

lowing方法:私はこのテストコードを実行するとき

public IObservable<TreeNode> FlattenTreeToObservable() 
    { 
     return 
      this.ChildNodes 
       .SelectMany(cn => cn.FlattenTreeToObservable()) 
       .StartWith(this); 
    } 

:今すぐ

var root = new TreeNode() { Name = "R" }; 

root.FlattenTreeToObservable().Subscribe(tn => Console.WriteLine(tn.Name)); 

var a1 = new TreeNode() { Name = "A1" }; 
root.ChildNodes.OnNext(a1); 

var b11 = new TreeNode() { Name = "B11" }; 
a1.ChildNodes.OnNext(b11); 

var b12 = new TreeNode() { Name = "B12" }; 
a1.ChildNodes.OnNext(b12); 

var a2 = new TreeNode() { Name = "A2" }; 
root.ChildNodes.OnNext(a2); 

var b21 = new TreeNode() { Name = "B21" }; 
a2.ChildNodes.OnNext(b21); 

var b22 = new TreeNode() { Name = "B22" }; 
a2.ChildNodes.OnNext(b22); 

を、私はこの出力を得る:

 
R 
A1 
B11 
B12 
A2 
B21 
B22 
+0

すごくいいですね!あなたが 'a1.ChildNodes = ...'のようなことをしたときにそれが壊れるのだろうかと思います。今はテストできませんが、あなたに戻ってきます。 – John

+0

DLLバージョン管理の問題については、この例の 'Splat'に関するコメントを参照してください。 – John

+0

@ジョン - いいえ、 'a1.ChildNodes = ...'をしないでください。それはそれを殺すでしょう。 – Enigmativity

関連する問題