2017-03-08 7 views
0

ファイルの内容に応じてボタンを動的に生成しています。lambdaのRelayCommandは一度だけ実行する

私はこの方法でそれを書く場合私のコードは一度だけRelayCommandを実行します。

var button = new Button(); 
button.Command = new RelayCommand(() => Messenger.Default.Send(new UseThisValue(value)); 
// button gets added to a treeview 

が、ラムダは、タグproperyに設定されているように私はそれを変更した場合、それは

var button = new Button(); 
button.Tag = new Action(() => Messenger.Default.Send(new UseThisValue(value)); 
button.Command = new RelayCommand(button.Tag as Action); 
// button gets added to a treeview 
たびに動作します

ここでは何が起こっていますか?アサインメントはいくつかの参照カウントを生かしたままにしていますか?私はC#をかなり新しくしているので、経験豊かな開発者には明白な何かを見落としているかもしれません。

+1

mvvmでは、コマンドはユーザインタフェースについて何も知らないはずです。コマンドはビューモデルを定義する必要があります。ビューモデルは、ビューを知っているか気にするものではありません。ビューで、バインディングを使用してボタンのコマンドを設定します。 –

答えて

2

再びガベージコレクションが発生します。

「実行」メソッドへの参照を格納するのはここではあまり明らかではありませんが、RelayCommand uses a WeakActionです。つまり、手渡したActionはガベージコレクションの対象です。

Windowのパフォーマンスモニタをプルアップし、Gen0ガベージコレクションカウンタを追加し、コレクションの発生と同時にボタンの停止を監視することもできます。例については、my answer hereを参照してください。

+0

質問をした直後、私はその答えを尋ねてきましたが、それも私の問題でした。 – RedX

関連する問題