c# - ViewModel 中 UIElements 的 UserControl 会破坏 MVVM?

标签 c# wpf xaml mvvm

我们的 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/

相关文章:

c# - 从innerHTML获取name属性

c# - C# 中带有信封的对象的 XML 序列化

c# - 如何维护DataGrid的SelectedItems中的顺序?

c# - 使用 LINQ to XML 更改命名空间值的最简单方法是什么?

c# - 如何使用类似插件的架构来扩展 WPF 应用程序?

c# - 在 C# 中使不安全代码变得安全

c# - 如何构造一个正确的MySQL连接串?

c# - Visual Studio 重构重命名导致 XAML 文件中无法解释的属性全局替换

c# - 如何决定每个用户状态的存储位置?注册表?应用程序数据?隔离存储?

c# - 如何在 Binding StringFormat 中使用变量文本?