我们的 WPF 应用程序已经有一个现有的 UI,其中单独的按钮按下将显示基于绑定(bind)到可见性 (MVVM) 的元素,其中 ICommand 将这些可见性属性设置为打开或关闭。这些效果很好,但最近我们被要求像以前一样按下按钮来显示/隐藏元素,但是另一种类型的按钮按下来显示一些其他元素,但在 TabControl 内。
我想这样做的方式是:
a) 创建包含这些元素的独立用户控件
b) 这些 UserControl 在运行时根据按钮按下通过 ViewModel 实例化,并通过 ObservableCollection 作为 ItemsSource 绑定(bind)到 View:
View 模型:
private ObservableCollection<Object> centerView;
public ObservableCollection<Object> CenterView
{
get { return centerView; }
}
...
UserControlOfReportRelatedElements reportsView = new UserControlOfReportRelatedElements();
CenterView.Clear();
Grid.SetRow(reportsView, 0);
CenterView.Add(reportsView);
XAML:
<ItemsControl ItemsSource="{Binding CenterView}" Grid.Row="2">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Grid/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
因此,根据 UserControl 是否包装在 TabControl 中,我们只需将其放入 ObservableCollection(在运行时)。
这行得通,而且很方便。但这会破坏 MVVM 吗?还有什么我们可以做的吗?
最佳答案
我会说,是的,这打破了 MVVM 模式。 MVVM 背后的理念之一是保持 View (UI) 和 View 模型(业务逻辑)彼此分离。
您的解决方案可能是创建一个 Base-ViewModel-Class,其中继承了不同 View (您的标签页)的 ViewModel。在您的 ObserableCollection 中,您拥有 Base-ViewModel-Instanced。
要向您的 View 模型显示正确的 View ,您可以在 App.xaml 中执行类似以下操作
<DataTemplate DataType="{x:Type viewModel:CustomViewModel1}">
<view:CustomView1/>
</DataTemplate>
通过此定义,您可以告诉您的应用程序,无论何时应显示 CustomViewModel1
,都应显示 CustomView1
。有了这个,DataContext 也被设置了。
一个很好的例子是 this
关于c# - ViewModel 中 UIElements 的 UserControl 会破坏 MVVM?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32645191/