MVVM和动态生成控件

时间:2013-09-01 17:03:31

标签: c# wpf xaml mvvm

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

enter image description here

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

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

4 个答案:

答案 0 :(得分:14)

猜猜我知道如何实现这一目标,但这是非常复杂的事情。首先,您应该理解MVVM的基本概念。 主ViewModel应该是一个具有ObservableCollection ViewModels的类,每个类都代表一个包含其数据和属性的列。

interface IViewModel : INotifyPropertyChanged,IDisposable
{
}

interface IColumnViewModel : IViewModel
{
}

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

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

在视图中,我认为ItemsControlItemTemplate之类的内容应该ContentControlDataTemplate一起嵌入,WPF会根据绑定的{{1}自动选择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好运:)

答案 1 :(得分:3)

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

答案 2 :(得分:3)

要在MVVM中编写类似的内容,您可以使用一个视图,即您的内容区域。该视图将具有视图模型,该视图模型的属性之一将是视图,或者该视图模型的若干属性将是视图。有时需要一点时间,但如果正确使用Inversion of Control和Dependency Injection,则视图视图在MVVM模式中是非常易于管理的。

答案 3 :(得分:1)

好吧,你的观点不是完全用XAML编写的 - 你用C#生成控件。

我认为你不会从改写它并将其装入MVVM模具中获得一些东西。只需保持现在的代码并享受。