2011-08-01 5 views
2

私はJosh Smith's Design explaining WPF + MVVMに従っています。彼のデモアプリケーションとほぼ同じ要件があります。 CustomerViewModelクラスのSaveコマンドをメインウィンドウのツールバーボタンに割り当てる必要があります。MainWindowからのICommandsへのアクセス:Josh Smithの記事

XAMLを使用することはできますか、コードビハインドとその方法のみで行うことはできますか?あなたがこれを行うことができます

おかげ

答えて

3

<Menu Height="23" HorizontalAlignment="Left" Name="menu1" VerticalAlignment="Top" Width="289" > 
    <MenuItem Header="File"> 
     <MenuItem Header="Save" Command="Save"/> 
    </MenuItem> 
</Menu> 

私は、このメソッドは、デフォルトの保存呼び出しますが、あなたは何ができるの保存方法カスタムを定義したい場合はかなり確信している:

<Menu Height="23" HorizontalAlignment="Left" Name="menu1" VerticalAlignment="Top" Width="289" > 
    <MenuItem Header="File"> 
     <MenuItem Header="Save" Command="{Binding Path="CustomSaveCommand"}"/> 
    </MenuItem> 
</Menu> 

このようにあなたのビューモデルにdatacontextリファレンスを追加してください。

<Window.DataContext> 
    <my:MainWindowViewModel/> 
</Window.DataContext> 
+0

はい、これはメインウィンドウのCustomSaveCommandを呼び出します。 CustomerViewModelのCustomSaveCommandを呼びたいと思います。 – Pak

+0

次に、DataContextを変更したいものに変更します。これは単なる例であり、必ずしもあなたの状況に100%適用されるとは限りません。 – Paul

0

返信いただきありがとうございます。ここで私は何をやったのですか。 上記のように、私はジョシュ・スミスのデザインを使用していましたが、CustomerViewModelオブジェクトのメソッドSave()(Command)をMainWindowViewModelから呼び出したいと思っていました。 メインウィンドウから、このようにツールバーボタンにクリックイベントをアタッチしました。

<Button Name="btnSaveAllWorkspaces" ToolTip="Save All Open Workspaces" Content="Save All" Click="OnSaveAllWorkspacesClicked"/>   

そして、背後にあるコードでは、

private void OnSaveAllWorkspacesClicked(object sender, RoutedEventArgs e) 
    { 
     if (MainVM != null) 
     { 
      if (MainVM.Workspaces != null && MainVM.Workspaces.Count > 0) 
      { 
       foreach (WorkspaceViewModel wkVM in MainVM.Workspaces) 
       { 
        CustomerViewModel vm = wkVM as CustomerViewModel; 
        if (vm != null) 
         vm.Save(); 
       } 
      } 
     } 
    } 

は当初、私はちょうどのみ現在アクティブなワークスペースを保存したかったが、その後、私はそれ、それはすべてのワークスペースの上部にあるグローバル・ボタンであると考えられ開いているすべてのワークスペースを保存するのが理にかなっているので、ループはforeachです。

XAMLを介してこれを行うより良い方法がある場合は、分かち合いましょう。私が以前行っていたものは何でも知っていた

おかげ

0

は、回避策だった、それは汚れていました。私がMVVMについてもっと理解したので、私はコードを再検討し続けました。ここに私がしたことがあります。

MainWindowViewModelにSaveCommandのICommand Proertyを追加し、Main Windowのツールボタンにバインドしました。現在アクティブなWorksSpaceViewModelのSaveCommandに呼び出しを委任します。

public override ICommand SaveCommand 
    { 
     get 
     { 
      return _currentWorkspace != null ? _currentWorkspace.SaveCommand : new RelayCommand (null, param => false); 
     } 
    } 

と、それは現在のワークスペースを追跡し、元のコード、のように

は、すなわち、(私はそれは、WPFは、残りの世話をしたのです変更

public ObservableCollection<WorkspaceViewModel> Workspaces 
    { 
     get 
     { 
      if (_workspaces == null) 
      { 
       _workspaces = new ObservableCollection<WorkspaceViewModel>(); 
       _workspaces.CollectionChanged += OnWorkspacesChanged; 
       CollectionViewSource.GetDefaultView(_workspaces).CurrentChanged += new EventHandler(MainWindowViewModel_CurrentChanged); 
      } 
      return _workspaces; 
     } 
    } 

    private void MainWindowViewModel_CurrentChanged(object sender, EventArgs e) 
    { 
     CurrentWorkspace = CollectionViewSource.GetDefaultView(_workspaces).CurrentItem as WorkspaceViewModel; 
     OnPropertyChanged("SaveCommand"); 
    } 

    public WorkspaceViewModel CurrentWorkspace 
    { 
     get { return _currentWorkspace; } 
     set 
     { 
      _currentWorkspace = value; 
      OnPropertyChanged("CurrentWorkspace"); 
     } 
    } 

のサブシステムに通知を確認しましたバリデーションに応じてボタンを有効、無効にする)!

もう一度、あなたのチップPaulに感謝します。

関連する問題