gpt4 book ai didi

.net - WPF MVVM 创建动态控件

转载 作者:行者123 更新时间:2023-12-04 06:47:51 28 4
gpt4 key购买 nike

WPF MVVM 创建动态控件 - 我有一个网格,我有一个工作(你可以说是一个 sql server 工作)的详细信息。

现在,对于每个工作,可能有“n”个工作变量。当我获取作业的记录时,它会获取此作业变量集合,这些变量是名称-值对,其中值可以是集合或日期时间值,甚至是整数或字符串。

现在我想在这里实现的是:
-- 如果运行变量是日期时间,那么我需要一个日期选择器
-- 如果是 int/String 我需要一个文本框
- 如果它是一个集合,那么一个组合框。
-- 它是一个位域然后是一个复选框

我不确定如何实现它,因为每个工作的这些值都可能不同。

最佳答案

我假设您将表示这些名称/值对的某种对象放入 ItemsControl 中。通过设置其 ItemsSource属性(property)。

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

使用 DataTemplate带触发器:

这种方法涉及通过 YourPropertyType 公开每个对象的“类型”。属性作为字符串。您将设置 ItemTemplate您的 ItemsControl到承载 ContentControl 的模板. ContentControl本身会有它的ContentTemplate使用触发器动态选择。

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

我假设您还有更多 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属性(property)来自 YourObjectDataTemplateSelector并将其设置为 XAML 中的模板。在实践中,您会定义更多类型为 DataTemplate 的属性。在 YourObjectDataTemplateSelector , 并在将模板选择器添加到控件的资源字典中时“配置”它。这允许您使用 StaticResource 直接为每个案例设置模板。来自 XAML 的标记扩展。

最后,将模板选择器连接到您的 ItemsControl :
<ItemsControl 
ItemsSource="..."
ItemTemplateSelector={StaticResource TemplateSelector}"
/>

关于.net - WPF MVVM 创建动态控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5267905/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com