我已经编写了一个使用 GUI 生成 sql 查询的工具,我想使用 MVVM 和 WPF 重写该工具,每个 sql 列类型都有不同的控件,如下图所示
我添加了一个基于 sql 列类型的列过滤器控件,并使用代码生成控件,就像我以前在 Windows 窗体中所做的那样。
- 在 MVVM 中,我读到 View 是完全使用 XAML 编写的, MVVM 是否适合我必须添加不同用户的应用程序 动态控制堆栈面板?
- 除非双击某些列,否则控件不会存在于 View 中,这意味着控件在 xaml 中不可用,也不会被隐藏或折叠。
- 有什么方法可以避免后面代码中的绑定(bind)?
- 我应该为每种列类型创建一个用户控件吗?
- 一般来说,使用 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 中,我想像 ItemsControl
和 ItemTemplate
,应该嵌入 ContentControl
和 DataTemplate
,那应该由 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/