13

我编写了一个使用 GUI 生成 sql 查询的工具,我想使用 MVVM 和 WPF 重写该工具,每个 sql 列类型都有不同的控件,如下图所示

在此处输入图像描述

我添加了一个基于 sql 列类型的列过滤器控件,并使用代码生成控件,就像我以前在 windows 窗体中所做的那样。

  1. 在 MVVM 中,我读到视图是完全使用 XAML 编写的,MVVM 是否适合这样的应用程序,我必须将不同的用户控件动态添加到堆栈面板?
  2. 除非双击某些列,否则控件将不存在于视图中,这意味着该控件在 xaml 中不可用,并且不会被隐藏或折叠。
  3. 有什么办法可以避免后面代码中的绑定?
  4. 我应该为每种列类型创建一个用户控件吗?
  5. 一般来说,使用 mvvm 开发具有复杂和动态 ui 的此类应用程序的最佳方法是什么?
4

4 回答 4

15

我想我知道如何实现这一点,但这是非常复杂的东西。首先你应该理解 MVVM 的基本概念。Main ViewModel 应该是一个具有ObservableCollectionViewModel 的类,每个 ViewModel 代表一个包含其数据和属性的列。

interface IViewModel : INotifyPropertyChanged,IDisposable
{
}

interface IColumnViewModel : IViewModel
{
}

class ViewModelBase : IViewModel
{
    // ... MVVM basics, PropertyChanged etc. ...
}

class MainViewModel : ViewModelBase
{
    ObservableCollection<IColumnViewModel> Columns {get; set}
}

在视图中,我想像ItemsControlwith之类的东西ItemTemplate,应该嵌入ContentControlwith DataTemplate,WPF 会根据DataContext列表项的绑定自动选择它。StackPanel本身并不适合,但它可以被调用为ItemsPanelTemplate

<Window
    xmlns:v="clr-namespace:WpfApplication.Views"
    xmlns:vm="clr-namespace:WpfApplication.ViewModels">
    <Window.Resources>
        <DataTemplate DataType="{x:Type TypeName=vm:TextColumnViewModel}">
            <v:TextColumnView/>
        </DataTemplate>
    </Window.Resources>
    <ItemsControl
        ItemsSource="{Binding Columns}">
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <StackPanel Orientation="Horizontal"/>
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <ContentControl Content="{Binding}"/>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
</Window>

因此,您应该为每种列类型构建 View/ViewModel 对。

希望,我的例子会有所帮助。祝你女朋友和 MVVM 好运 :)

于 2013-09-02T19:08:34.560 回答
3

如果我正确理解了您的场景:您可以使用数据模板和项目模板例如,我编写了一个应用程序,它将数据加载到集合中,然后根据定义在包装面板 [或堆栈面板] 中显示该集合的每个项目数据模板。并且 Wrap penel 项目是由集合本身在两种方式绑定内同步的你应该考虑使用 Observable Collections 来实现这个目标然后你可以填充集合并在视图上查看结果我希望这会有所帮助

于 2013-09-01T18:09:18.423 回答
3

要在 MVVM 中编写类似的内容,您将拥有一个视图,即您的内容区域。该视图将有一个视图模型,该视图模型的一个属性将是一个视图,或者该视图模型的几个属性将是一个视图。有时需要花一些时间来思考,但是如果您正确使用控制反转和依赖注入,则视图视图在 MVVM 模式中非常易于管理。

于 2013-09-01T20:15:12.840 回答
1

好吧,您的视图并非完全用 XAML 编写 - 您在 C# 中生成控件。

我不认为你会从重写这个并将其安装到 MVVM 模型中获得什么。只需保持现在的代码并享受。

于 2013-09-01T17:27:36.007 回答