2011-08-01 7 views

답변

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> 

viewmodel에 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"); 
     } 
    } 

의 서브 시스템을 통지 확인했다 유효성 확인에 따라 버튼 활성화, 비활성화)!

다시 말하면, 귀하의 팁 바울에 감사드립니다.