如何将视图模型与 xaml 中定义的元素分开
How to separate view model from elements defined in xaml
我有一个需要调用 CommitEdit() 的 Telerik RadGridView。目前我正在使用视图模型中的以下代码调用它。
((MainWindow)Application.Current.MainWindow).Container.View.RadGrid.CommitEdit();
但我发现这使我无法对视图模型进行单元测试。在这种情况下,如何将视图模型与视图分开?
为了将 "UI" 特定功能与 ViewModel 分离,您可以向 ViewModel 添加一个事件,您将在需要提交编辑时调用该事件。类似于:
public ViewModel : IViewModel
{
public event Action CommitEdit;
}
然后,在您后面的代码中,订阅该事件:
private void OnWindowLoaded(object sender, RoutedEventArgs e)
{
var dataContext = DataContext as IViewModel;
if (dataContext != null)
{
dataContext.CommitEdit += (()=>{ Container.View.RadGrid.CommitEdit(); })
}
}
现在,当您进行单元测试时,您可以直接对 ViewModel 进行单元测试,而无需依赖于您的 RadGrid。这将允许测试是否调用事件操作。
我有一个需要调用 CommitEdit() 的 Telerik RadGridView。目前我正在使用视图模型中的以下代码调用它。
((MainWindow)Application.Current.MainWindow).Container.View.RadGrid.CommitEdit();
但我发现这使我无法对视图模型进行单元测试。在这种情况下,如何将视图模型与视图分开?
为了将 "UI" 特定功能与 ViewModel 分离,您可以向 ViewModel 添加一个事件,您将在需要提交编辑时调用该事件。类似于:
public ViewModel : IViewModel
{
public event Action CommitEdit;
}
然后,在您后面的代码中,订阅该事件:
private void OnWindowLoaded(object sender, RoutedEventArgs e)
{
var dataContext = DataContext as IViewModel;
if (dataContext != null)
{
dataContext.CommitEdit += (()=>{ Container.View.RadGrid.CommitEdit(); })
}
}
现在,当您进行单元测试时,您可以直接对 ViewModel 进行单元测试,而无需依赖于您的 RadGrid。这将允许测试是否调用事件操作。