我编写了一个使用GUI生成sql查询的工具,我想使用MVVM和WPF重写该工具,每个sql列类型都有不同的控件,如下图所示
我添加了一个基于sql列类型的列过滤器控件,我使用代码生成控件,就像我以前在Windows窗体中一样。
答案 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}
}
在视图中,我认为ItemsControl
与ItemTemplate
之类的内容应该ContentControl
与DataTemplate
一起嵌入,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模具中获得一些东西。只需保持现在的代码并享受。