WPF MVVM创建动态控件

时间:2011-03-11 01:06:03

标签: .net wpf mvvm dynamic controls

WPF MVVM创建动态控件 - 我有一个网格,我有一个工作(你可以说类似于SQL服务器工作)的详细信息。

现在,每个工作都可能有'n'个工作变量。当我获取作业的记录时,它获取作为名称 - 值对的Job变量集合,其中value可以是集合或日期时间值,甚至是int或字符串。

现在我想在这里实现的是: - 如果run变量是datetime,那么我需要一个datepicker - 如果是int / String我需要一个文本框 - 如果它是一个集合,那么一个组合框。 - 它是一个位字段,然后是一个复选框

我不确定如何实现它,因为这些值对于每一项工作都可能有所不同。

2 个答案:

答案 0 :(得分:9)

我假设你会通过设置ItemsControl属性将某些代表这些名称/值对的对象放入ItemsSource

您可以使用几种解决方案。

使用带有触发器的DataTemplate

此方法涉及通过YourPropertyType属性将每个对象的“类型”公开为字符串。您会将ItemTemplate的{​​{1}}设置为托管ItemsControl的模板。 ContentControl本身将使用触发器动态选择ContentControl

所有这些都可以在XAML中以声明方式完成。

我假设您还有ContentTemplate名为DataTemplates(可以为空),DefaultTemplateIntegerTemplate等,以便为每个案例草拟出可视树。

这将是StringTemplate

ItemsControl.ItemTemplate

使用<DataTemplate> <ContentControl x:Name="MyContentControl" Content="{Binding}" ContentTemplate="{StaticResource DefaultTemplate}"/> <DataTemplate.Triggers> <DataTrigger Binding="{Binding YourPropertyType}" Value="Integer"> <Setter TargetName="MyContentControl" Property="ContentTemplate" Value="{StaticResource IntegerTemplate}" /> </DataTrigger> <DataTrigger Binding="{Binding YourPropertyType}" Value="String"> <Setter TargetName="MyContentControl" Property="ContentTemplate" Value="{StaticResource StringTemplate}" /> </DataTrigger> <!-- and so on --> </DataTemplate.Triggers> </DataTemplate>

这种方法需要代码隐藏,但它不会强制您将每个名称/值对的“类型”公开为字符串,它允许您选择使用哪个模板以及更复杂的逻辑。

它涉及创建一个类作为模板选择器:

DataTemplateSelector

然后,您需要在某处实例化模板选择器(让我们说在您的class YourObjectDataTemplateSelector : DataTemplateSelector { public DataTemplate DefaultTemplate { get; set; } public override DataTemplate SelectTemplate(object item, DependencyObject container) { var yourObject = (YourObjectType) item; // Get hold of a DataTemplate based on any attribute of item var templateToUse = this.DefaultTemplate; return templateToUse; } } 内)

UserControl

请注意,我从<UserControl.Resources> <localNamespace:YourObjectDataTemplateSelector x:Key="TemplateSelector" DefaultTemplate="{StaticResource DefaultTemplate}" /> </UserControl.Resources> 公开了DefaultTemplate属性,并将其设置为XAML中的模板。实际上,您可以在YourObjectDataTemplateSelector上定义更多类型DataTemplate的属性,并在将模板选择器添加到控件的资源字典中时“配置”它。这允许您使用XAML中的YourObjectDataTemplateSelector标记扩展名为每个案例直接设置模板。

最后,将模板选择器连接到StaticResource

ItemsControl

答案 1 :(得分:2)

我相信您正在考虑使用某种形式的Data TemplatingDataTemplateSelector来实现您的目标。