MVVM和动态生成控件

13

我编写了一个使用GUI生成SQL查询语句的工具,现在想要使用MVVM和WPF重写这个工具。如下图所示,每种SQL列类型都有不同的控件。

enter image description here

我根据SQL列类型添加了一个列过滤器控件,并使用代码动态生成控件,就像在Windows Forms中一样。

  1. 在MVVM模式下,我看到视图完全使用XAML编写, 这种模式是否适合我需要动态向Stack Panel添加不同用户控件的应用程序?
  2. 除非某个列被双击,否则这些控件不会出现在视图中,这意味着该控件不会在XAML中出现并且不会被隐藏或折叠。
  3. 有没有办法可以避免在代码后台中进行绑定?
  4. 我应该为每种列类型创建一个用户控件吗?
  5. 总体上,使用MVVM开发具有复杂和动态UI的应用程序的最佳方法是什么?

4
XAML不等同于MVVM,WPF也不等同于MVVM。WPF是MVVM的好朋友,而XAML只是UI标记语言。XAML视图并不仅限于XAML本身 - 它有一个连接类(所谓的Code-Behind),但您不应该将其用于主要逻辑,尽可能少地使用它。当然,您可以在Code-Behind中实现控件生成,但这绝对不是MVVM的方法。 - oxfn
3
@user1590636 你生成的图形用户界面看起来非常漂亮和简单。 - WiiMaxx
4个回答

15

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

interface IViewModel : INotifyPropertyChanged,IDisposable
{
}

interface IColumnViewModel : IViewModel
{
}

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

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

在我的看法中,像是使用ItemsControlItemTemplate,它应该将ContentControlDataTemplate嵌入其中,这应该是根据绑定的列表项的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一切顺利:)


3
如果我正确理解您的情况: 您可以使用数据模板和项模板 例如,我编写了一个应用程序,它将数据加载到集合中,然后根据定义的数据模板在Wrap Panel [或stack panel]中显示该集合的每个项目。 而Wrap Panel项通过双向绑定与集合本身保持同步 您应该考虑使用Observable Collections来实现此目标 然后,您可以填充集合并在视图上查看结果 希望这有所帮助

3

要在MVVM中编写类似此内容的内容,您需要一个视图,例如您的内容区域。该视图将具有一个视图模型,该视图模型的属性之一将是视图,或该视图模型的多个属性将是视图。有时需要花一些时间来理解,但如果正确使用IOC和DI,则可以在MVVM模式中非常方便地管理视图。


1

好的,你的视图不完全是用XAML编写的-你在C#中生成控件。

我认为将其重写并适配MVVM模式是没有必要的。只需保持现有代码并享受即可。


6
问题是,如果我不使用 MVVM,我的女朋友就不会嫁给我。如果你用 MVVM 写这样的东西,能否给我一个大致的想法? - user1590636
1
@zmbq 他不需要在代码中创建绑定,他只需要使用一堆DataTemplates,这些模板应该能够以通用的方式显示他的内容。 - WiiMaxx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接