다음은 Josh Smith's Design explaining WPF + MVVM입니다. 데모 응용 프로그램과 거의 동일한 요구 사항이 있습니다. CustomerViewModel 클래스의 저장 명령을 주 창에있는 도구 모음 단추에 지정해야합니다.MainWindow의 ICommands 액세스 : Josh Smith의 기사
XAML 또는 코드 숨김을 통해서만 가능합니까?
감사
다음은 Josh Smith's Design explaining WPF + MVVM입니다. 데모 응용 프로그램과 거의 동일한 요구 사항이 있습니다. CustomerViewModel 클래스의 저장 명령을 주 창에있는 도구 모음 단추에 지정해야합니다.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>
viewmodel에 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");
}
}
의 서브 시스템을 통지 확인했다 유효성 확인에 따라 버튼 활성화, 비활성화)!
다시 말하면, 귀하의 팁 바울에 감사드립니다.
네,하지만 메인 윈도우의 CustomSaveCommand를 호출 할 것입니다. CustomerViewModel의 CustomSaveCommand를 호출하려고합니다. – Pak
그러면 DataContext를 원하는대로 변경할 수 있습니다. 이것은 단지 예일 뿐이며 귀하의 상황에 반드시 100 % 적용되지는 않습니다. – Paul