はジスミスの実施のRelayCommand欠陥のある?
-
21-09-2019 - |
質問
検討の参考 ジSmith'記事コンポーネントのラインナップアプリケーションのモデルビュー-ViewModelデザインパターン, は、具体的には、例実施 RelayCommand
(図表3)。(はじめにお読みの条この質問です。)
一般的に、と思いを実施するものについて、代表団の CanExecuteChanged
契約数は、 CommandManager
's RequerySuggested
イベントです。の 書 RequerySuggested
状態:
このイベントは静的ま のみにハンドラとして弱い 参考にする。オブジェクトを待 このイベントでは強い 基準となるイベントハンドラを を回避でゴミを収集します。この することで可能となりますと 民間分野に割り当 ハンドラとしての価値の前後 取り付けるこのイベントです。
しかし、サンプルの実施 RelayCommand
なの維持等に加入しハンドラ:
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
- この漏れは、弱参照の
RelayCommand
's"顧客要求することは、ユーザのRelayCommand
理解の実施CanExecuteChanged
および維持のライブ参照すか? その場合、意味はあるのは、例えば、変更の実施
RelayCommand
するには、次のようなものを軽減する可能性早GCのCanExecuteChanged
契約者:// This event never actually fires. It's purely lifetime mgm't. private event EventHandler canExecChangedRef; public event EventHandler CanExecuteChanged { add { CommandManager.RequerySuggested += value; this.canExecChangedRef += value; } remove { this.canExecChangedRef -= value; CommandManager.RequerySuggested -= value; } }
解決
私も、もうこの実装に不備があ, でも漏れにおける弱参照のイベントハンドラです。これは何かを実際に非常に悪い事です。
のを使用していまョ光ツールキットの RelayCommand
の実施、及びそれにも実施しています。
次のコードのない呼び出し OnCanExecuteEditChanged
:
private static void OnCommandEditChanged(DependencyObject d,
DependencyPropertyChangedEventArgs e)
{
var @this = d as MyViewBase;
if (@this == null)
{
return;
}
var oldCommand = e.OldValue as ICommand;
if (oldCommand != null)
{
oldCommand.CanExecuteChanged -= @this.OnCanExecuteEditChanged;
}
var newCommand = e.NewValue as ICommand;
if (newCommand != null)
{
newCommand.CanExecuteChanged += @this.OnCanExecuteEditChanged;
}
}
しかし、変更した場合、購入したので、このように取り組む予定です:
private static EventHandler _eventHandler;
private static void OnCommandEditChanged(DependencyObject d,
DependencyPropertyChangedEventArgs e)
{
var @this = d as MyViewBase;
if (@this == null)
{
return;
}
if (_eventHandler == null)
_eventHandler = new EventHandler(@this.OnCanExecuteEditChanged);
var oldCommand = e.OldValue as ICommand;
if (oldCommand != null)
{
oldCommand.CanExecuteChanged -= _eventHandler;
}
var newCommand = e.NewValue as ICommand;
if (newCommand != null)
{
newCommand.CanExecuteChanged += _eventHandler;
}
}
唯一の違いは?ように記載した書類の CommandManager.RequerySuggested
私のイベントハンドラです。
他のヒント
がその場で発音を確認することがその答えが、ジの コメント 彼の"理解を奪いコマンド"article:
[...]使用にはWeakEventパターンにおCanExecuteChanged イベントです。これは視覚的要素がフックのイベントが、 コマンドのオブジェクトがないとゴミの回収までのアプリ シャットダウンすると、非常に実在する可能性のためのメモリリークを引き起こします。[...]
引数のうた CanExecuteChanged
実装を行う担当者に役立ちなみ弱の登録のハンドラからコンポーネントのラインナップ Visuals
ているかをunhookます。これは、最も簡便に実施する委譲を行うための CommandManager
, にメディアに取り上げられていない。ると考えられるのも同じ理由です。
もにリフレクターで実施し、同じものではないでしょうか RoutedCommand
クラスは、いかなければOK...いのコンポーネントのラインナップチームミ;)
であると考えている不十分なものである。
による経路等の変更のイベントのCommandManagerだの挙動
このコンポーネントのラインナップ晴 インフラに求めてRelayCommand オブジェできない場合の実行き は、そのような内蔵コマンド.
しかし、どのようなときをご希望のお知らせしてすべてのマクロをバインドされたシングルコマンドを再評価CanExecute状況を教えてほしい。彼の実施をうけなければなりませんのCommandManagerとを意味
一コマンドの結合のお申し込みが見直
すべて含んでいるものなの丘の豆を評価するCanExecuteは、副作用などのデータベースアクセスにはロングタスク)をもって収集した...そのような使用は、大槌を駆動するfriggenに爪がある。
いすることを真剣に検討することを含意を行っています。
私がここでのポイントはなかなかできないので、以下の構成の参考にイベントハンドラのcontructor?
_canExecute = canExecute;