私はJosh Smith's Design explaining WPF + MVVMに従っています。彼のデモアプリケーションとほぼ同じ要件があります。 CustomerViewModelクラスのSaveコマンドをメインウィンドウのツールバーボタンに割り当てる必要があります。MainWindowからのICommandsへのアクセス:Josh Smithの記事
XAMLを使用することはできますか、コードビハインドとその方法のみで行うことはできますか?あなたがこれを行うことができます
おかげ
私はJosh Smith's Design explaining WPF + MVVMに従っています。彼のデモアプリケーションとほぼ同じ要件があります。 CustomerViewModelクラスのSaveコマンドをメインウィンドウのツールバーボタンに割り当てる必要があります。MainWindowからのICommandsへのアクセス:Josh Smithの記事
XAMLを使用することはできますか、コードビハインドとその方法のみで行うことはできますか?あなたがこれを行うことができます
おかげ
:
<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>
返信いただきありがとうございます。ここで私は何をやったのですか。 上記のように、私はジョシュ・スミスのデザインを使用していましたが、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を介してこれを行うより良い方法がある場合は、分かち合いましょう。私が以前行っていたものは何でも知っていた
おかげ
は、回避策だった、それは汚れていました。私が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に感謝します。
はい、これはメインウィンドウのCustomSaveCommandを呼び出します。 CustomerViewModelのCustomSaveCommandを呼びたいと思います。 – Pak
次に、DataContextを変更したいものに変更します。これは単なる例であり、必ずしもあなたの状況に100%適用されるとは限りません。 – Paul