1

私がやっていることのポイントは、ビューモデルで発生する必要があることがたくさんあるということですが、コンストラクターではなく、ビューがロードされたときです。イベント ハンドラーを接続してメッセージを送信することもできますが、それはちょっと雑に思えます。このロジックが含まれている基本ビューと基本ビューモデルを実装しているので、すべてのビューがデフォルトで取得されることを願っています。

おそらく、私が望んでいるもの、つまり送信者を取得することさえできません。これがRoutedEventArgs.OriginalSourceが本来あるべきものだと思いましたか?

[編集] とりあえず、xaml.cs に EventHandler を接続しましたが、案の定、OriginalSource もそこで null です。したがって、コマンドでもビュー/送信者への参照を取得できるかどうかを知る必要があると思いますか? [/編集]

私の実装では、「ウィンドウ」の作成を担当するビューモデルへのヘルパー クラスが、すべてのウィンドウが追加される「ホスト」コントロールを認識している必要があります。eventtocommand を使用する範囲外でこれを達成するための提案を受け入れます。:)

(Unloaded のコードは同じです)

    #region ViewLoadedCommand
    private RelayCommand<RoutedEventArgs> _viewLoadedCommand = null;
    /// <summary>
    /// Command to handle the control's Loaded event. 
    /// </summary>
    public RelayCommand<RoutedEventArgs> ViewLoadedCommand
    {
        get
        {
            // lazy-instantiate the RelayCommand on first usage
            if (_viewLoadedCommand == null)
            {
                _viewLoadedCommand = new RelayCommand<RoutedEventArgs>(
                    e => this.OnViewLoadedCommand(e));
            }
            return _viewLoadedCommand;
        }
    }
    #endregion ViewLoadedCommand


    #region View EventHandlers
    protected virtual void OnViewLoadedCommand(RoutedEventArgs e)
    {
        EventHandler handler = ViewLoaded;
        if (handler != null)
        {
            handler(this, e);
        }
    }
    #endregion
4

2 に答える 2

3

私はこれらの問題をストレートな xaml と可能な限りコマンドで解決しようとしています。次のように、View (UserControl) 自体で EventToCommand を使用しました。

<i:Interaction.Triggers>
  <i:EventTrigger EventName="Loaded">
    <mvvmlight:EventToCommand Command="{Binding LoadCommand}" />
  </i:EventTrigger>
</i:Interaction.Triggers>
于 2011-06-03T12:47:24.010 に答える
2

ジョー、

MVVM に関する私のスタンスは次のとおりです。
View : ViewModel について知っている
ViewModel : Model について知っている (View の知識がない)
Model : データを保持します。(ViewModel、Viewの知識はありません)

私があなたの状況にあった場合、ベース ViewModel にカスタム インターフェイスを実装させますIViewModel。(実際、私とすべての ViewModel が ViewModelBase を継承することIViewModelによって実装されるインターフェイスを持っています。)public abstract class ViewModelBase

public interface IViewModel
{  
   void Load();
   void UnLoad();
   // other Properties, Methods, etc.
}
public abstract class ViewModelBase : IViewModel
{
   public virtual/*or abstract*/ void Load()
   {
      // code
   }
}

あなたのビューで:

this.Loaded += (o, e) => { if(ViewModel != null) { ViewModel.Load(); } }  

最後に、特定のビューやビューモデルを区別するために、パブリック文字列トークン (Guid によって生成されたもの) を使用します。

于 2011-01-24T19:07:02.367 に答える