다른 ViewModel에 있는 커멘드를 실행 시키는 방법이 있는지 궁금합니다.
ChatGPT는 UserControl에서 이벤트가 발생할 때 CommandParameter로 MainViewModel를 바인딩 시키면 된다고 하는데, 확인해 보니 바인딩이 안되는거 같습니다.(null로 전달 됨)
혹시 방법이 있을까요?
Window에 있는 DataContext인 MainViewModel은 PageChange 커멘드를 가지고 있으며, PageChange 는 CommandParameter로 전달받은 이름과 동일한 UserControl를 CurrentPage에 할당합니다. CurrentPage가 변경되면, UserControl 를 동적으로 변경 시킵니다.
//MainWindow.xaml 중 일부
<Window x:Name="window" x:Class="UI.MainWindow"
xmlns:local="clr-namespace:UI">
<Window.DataContext>
<local:MainViewModel/>
</Window.DataContext>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="90"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
</Grid>
<Grid Grid.Column="0" >
<Button Command="{Binding PageChange}" CommandParameter="변경할UC명"/>
</Grid>
<Grid Grid.Column="1" >
<UserControl x:Name="pageView" Content="{Binding CurrentPage}" />
</Grid>
</Window>
//MainViewModel.cs 중 일부
private UserControl _currentPage = new();
public UserControl CurrentPage
{
get => _currentPage;
private set { _currentPage = value; OnPropertyChanged(); }
}
private ICommand? _PageChange = null;
public ICommand PageChange
{
get
{
_PageChange ??= new Command.RelayCommand(PageChangAction);
return _PageChange;
}
}
private void PageChangAction(object obj)
{
//obj와 일치하는 이름을 가진 UserControl를 CurrentPage에 할당
}
CurrentPage에 표시되는 UserControl 중 하나는 다음과 같습니다.
<UserControl x:Class="UI.SubPage.SubUC"
xmlns:local="clr-namespace:DeviceMangerUI.Engineering"
xmlns:root="clr-namespace:UI" >
<UserControl.DataContext>
<local:SubViewModel/>
</UserControl.DataContext>
<Grid>
// 버튼을 클릭하면, 내용을 처리 후 MainViewModel의 PageChange를 실행시키고 싶어요.
// ChatGPT가 CommandParameter에 바인딩 하면 된다는데,,, CommandParameter가 Null로 전달되요
<Button Command="{Binding CallMainCommand}"
CommandParameter="{Binding DataContext, RelativeSource={RelativeSource AncestorType=Window}}" />
</Grid>
</UserControl>
// SubViewModel.cs 중 일부
private ICommand? _callMainCommand = null;
public ICommand CallMainCommand
{
get
{
_callMainCommand ??= new Command.RelayCommand(ExecuteCallMainCommand, (object obj) => true);
return _callMainCommand ;
}
}
private void ExecuteCallMainCommand(object parameter)
{
// SubViewModel에서 필요한 작업을 수행
// 이제 MainViewModel의 PageChange 커맨드를 실행하고 싶은데,
// parameter가 null로 전달 되요 ㅠ
if (parameter is MainViewModel mainViewModel)
{
mainViewModel.PageChange.Execute("변경할UC명");
}
}