WPF MVVM创建动态控件 - 我有一个网格,我有一个工作(你可以说类似于SQL服务器工作)的详细信息。
现在,每个工作都可能有'n'个工作变量。当我获取作业的记录时,它获取作为名称 - 值对的Job变量集合,其中value可以是集合或日期时间值,甚至是int或字符串。
现在我想在这里实现的是: - 如果run变量是datetime,那么我需要一个datepicker - 如果是int / String我需要一个文本框 - 如果它是一个集合,那么一个组合框。 - 它是一个位字段,然后是一个复选框
我不确定如何实现它,因为这些值对于每一项工作都可能有所不同。
答案 0 :(得分:9)
我假设你会通过设置ItemsControl
属性将某些代表这些名称/值对的对象放入ItemsSource
。
您可以使用几种解决方案。
DataTemplate
:此方法涉及通过YourPropertyType
属性将每个对象的“类型”公开为字符串。您会将ItemTemplate
的{{1}}设置为托管ItemsControl
的模板。 ContentControl
本身将使用触发器动态选择ContentControl
。
所有这些都可以在XAML中以声明方式完成。
我假设您还有ContentTemplate
名为DataTemplates
(可以为空),DefaultTemplate
,IntegerTemplate
等,以便为每个案例草拟出可视树。
这将是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 Templating和DataTemplateSelector来实现您的目标。