Dee*_*ena 5 c# data-binding wpf code-behind mvvm
想象一下,你想要一个Save & Close
和Cancel & Close
你的花式WPF MVVM窗口上的按钮?
你会怎么做?MVVM规定你将按钮绑定到ICommand
控制器的反转并指示你View
可能知道你的ViewModel
但不是相反.
我在网上找到了一个解决方案,它有一个ViewModel
结束事件,View
订阅如下:
private void OnLoaded(Object sender
, RoutedEventArgs e)
{
IFilterViewModel viewModel = (IFilterViewModel)DataContext;
viewModel.Closing += OnViewModelClosing;
}
private void OnViewModelClosing(Object sender
, EventArgs<Result> e)
{
IFilterViewModel viewModel = (IFilterViewModel)DataContext;
viewModel.Closing -= OnViewModelClosing;
DialogResult = (e.Value == Result.OK) ? true : false;
Close();
}
Run Code Online (Sandbox Code Playgroud)
但是这与我迄今为止设计良好的MVVM混合在一起.
另一个问题是在显示主窗口时显示许可问题消息框.我可以再次使用Window
.Loaded
像我上面那样的事件,但这也打破了MVVM,不是吗?
在这些情况下,是否有一种干净的方式或者应该是实用的而不是迂腐的?
首先,创建一个仅包含Close
方法的接口:
interface IClosable
{
void Close();
}
Run Code Online (Sandbox Code Playgroud)
接下来,使您的窗口实现IClosable
:
class MyWindow : Window, IClosable
{
public MyWindow()
{
InitializeComponent();
}
}
Run Code Online (Sandbox Code Playgroud)
然后让视图将自身作为IClosable
命令参数传递给视图模型:
<Button Command="{Binding CloseCommand}" CommandParameter="{Binding RelativeSource={RelativeSource AncestorType={x:Type Window}}}" />
Run Code Online (Sandbox Code Playgroud)
最后,命令调用Close
:
CloseCommand = new DelegateCommand<IClosable>( view => view.Close() );
Run Code Online (Sandbox Code Playgroud)
我们现在有什么?
, IClosable
归档时间: |
|
查看次数: |
512 次 |
最近记录: |