C# ViewModel中的GetView()vs属性

C# ViewModel中的GetView()vs属性,c#,wpf,mvvm,caliburn.micro,C#,Wpf,Mvvm,Caliburn.micro,当前,当某个事件(IEventAggregator)发生时,我需要设置TabControl的SelectedIndex属性,并考虑如何实现它 我提出了两种可能性: 使用ViewAware提供的GetView()访问my TabControl并将SelectedIndex设置为my value 在关联的ViewModel中使用属性,并通过XAML将此属性绑定到TabControl的SelectedIndex属性 这两个选项都很好,但我个人想回答这个问题,因为这不是我第一次想知道在这种情况下在哪

当前,当某个事件(
IEventAggregator
)发生时,我需要设置TabControl的
SelectedIndex
属性,并考虑如何实现它

我提出了两种可能性:

  • 使用
    ViewAware
    提供的
    GetView()
    访问my TabControl并将SelectedIndex设置为my value
  • 在关联的ViewModel中使用属性,并通过XAML将此属性绑定到TabControl的SelectedIndex属性
这两个选项都很好,但我个人想回答这个问题,因为这不是我第一次想知道在这种情况下在哪里实现功能

我知道第一个选项不会启用Notify支持,但除此之外:正确的方法是什么?

使用
GetView()
方法直接从viewmodel操作视图完全破坏了MVVM。你最好把你所有的逻辑都放在代码后面。MVVM的全部目的是抽象出实际的视图,以便将其与逻辑解耦,并且可以对应用程序进行单元测试

如果您将来改变了对选项卡的看法,并决定以其他方式显示多个视图,该怎么办?现在,您必须开始编辑viewmodel来编辑新视图,而不仅仅是调整一些XAML


对于单元测试,您将无法模拟TabControl。

我通常将选项卡作为模型从VM中公开,并在VM上具有SelectedItem属性。将tab控件的ItemsSource绑定到集合,并在VM上选择EdItem以将其绑定到该集合。对,我也是如此。然而,我认为当我们通过GetView方法访问控件时,我们最终会得到更少的代码。我只是不确定这是否是一个好方法。因此,您想知道是否应该将代码移到ViewModel中:|它实际上不是代码隐藏,因为我在ViewModel中操作。但是是的,我们越来越近了。就这样,谢谢。我完全忘记了抽象概念!