use*_*070 4 c# wpf datacontext user-controls viewmodel
我有一个窗口,托管各种UserControl作为页面.是否可以在usercontrol的datacontext中关闭我没有引用的窗口?简化细节:
SetupWindow
public SetupWindow()
{
InitializeComponent();
Switcher.SetupWindow = this;
Switcher.Switch(new SetupStart());
}
public void Navigate(UserControl nextPage)
{
this.Content = nextPage;
}
Run Code Online (Sandbox Code Playgroud)
SetupStart UserControl
<UserControl x:Class="...">
<UserControl.DataContext>
<local:SetupStartViewModel/>
</UserControl.DataContext>
<Grid>
<Button Content="Continue" Command="{Binding ContinueCommand}"/>
</Grid>
</UserControl>
Run Code Online (Sandbox Code Playgroud)
SetupStartViewModel
public SetupStartViewModel()
{
}
private bool canContinueCommandExecute() { return true; }
private void continueCommandExectue()
{
Switcher.Switch(new SetupFinish());
}
public ICommand ContinueCommand
{
get { return new RelayCommand(continueCommandExectue, canContinueCommandExecute); }
}
Run Code Online (Sandbox Code Playgroud)
我这样做是通过RequestClose在我的ViewModel中有一个事件,它可以在希望视图关闭时引发.
然后Close()通过创建窗口的代码将其连接到窗口的命令.例如
var window = new Window();
var viewModel = new MyViewModel();
window.Content = viewModel;
viewModel.RequestClose += window.Close;
window.Show()
Run Code Online (Sandbox Code Playgroud)
这样,所有与窗口创建有关的东西都在一个地方处理.视图或视图模型都不知道窗口.
我设法从这里找到答案的解决方案:如何将关闭命令绑定到按钮
视图模型:
public ICommand CloseCommand
{
get { return new RelayCommand<object>((o) => ((Window)o).Close(), (o) => true); }
}
Run Code Online (Sandbox Code Playgroud)
视图:
<Button Command="{Binding CloseCommand}" CommandParameter="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}" Content="Close"/>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6159 次 |
| 最近记录: |