c# - MVVM 和控件的动态生成

标签 c# wpf xaml mvvm

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

enter image description here

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

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

最佳答案

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

interface IViewModel : INotifyPropertyChanged,IDisposable
{
}

interface IColumnViewModel : IViewModel
{
}

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

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

在 View 中,我想像 ItemsControlItemTemplate,应该嵌入 ContentControlDataTemplate,那应该由 WPF 根据绑定(bind)的 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 好运:)

关于c# - MVVM 和控件的动态生成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18560776/

相关文章:

c# - 在 C# 中解析命令行参数/选项

c# - 如何使用 DataTemplates 支持 ListBox 的继承

c# - 按钮命令绑定(bind)不调用 Xamarin.Forms 中的绑定(bind)命令

c# - 如何有效地将一个可观察集合中的范围选择到另一个可观察集合中

c# - WPF - ListView 更新非常零星

xaml - 如何检测 ScrollViewer 是否超出其可用范围

wpf - 默认 RenderTransform 转换器语法

c# - 如何比较两个二维数组

C# - 将 HTML 无序列表转换为 JSON 数组

c# - .NET 加密字节数组