gpt4 book ai didi

c# - 我应该如何在 WPF 窗口中动态创建用户控件?

转载 作者:行者123 更新时间:2023-12-03 10:30:28 24 4
gpt4 key购买 nike

我目前正在处理一些 WPF 的东西。在将三个非常相似的形式合并为一个的过程中,我提出了一个问题。我编写的代码有效,但似乎远非最佳解决方案,所以我想我会向更广泛的受众寻求反馈和/或更好的解决方案。

一些背景
这三种形式共享很多 XAML 和代码隐藏,但每种形式都有一个不同的部分。我以一种形式保留了所有共享代码,并将不同的部分拆分为 UserControl,目的是在运行时将其中一个动态加载到容器中。我们使用的是 MVVM,所以表单有一个 ViewModel,新的 UserControls 也是如此。自然,表单的 ViewModel 充当父级,并包含新 UserControls 的 ViewModel 作为子级。

问题本身
最初,我使用带有 DataTemplateSelector 的 ContentControl 从多个 DataTemplate 中进行选择,每个 DataTemplate 都包含一个 UserControl。绑定(bind)到 ContentControl 的 Content 属性的父 View 模型的属性在 DataTemplateSelector 中用于选择要使用的 DataTemplate。由于我并不过分迷恋必须设置 Content 属性,因此我切换到在 ContentControl 上使用带有 DataTriggers 的 Style,执行几乎相同的任务。但是,我需要能够遍历逻辑树(用于错误检查,如果您想知道的话),并且使用任何一种方法设置 ContentTemplate 似乎都不允许我继续沿着逻辑树从 ContentControl 进入 UserControl一旦加载。 UserControl 在容器中可见,并且通过其 DataTemplate 定义具有与之关联的正确 ViewModel,但 ContentControl 没有逻辑子级,因为 Content 属性为空。因此,我回退到的解决方案是在表单的构造函数中检查父 View 模型上的相关属性,并将其中一个 UserControl 显式实例化到 ContentControl 的 Content 属性中。完成后,我可以将逻辑树移入 UserControl。似乎必须有比这更好的做事方式,也许是在 XAML 中做这一切的某种方式。

所以...
有没有更好的方法来动态选择和实例化我的用户控件之一?我将表单的不同部分拆分为 UserControls 的基本技术听起来合乎逻辑吗?看起来这应该是相当普遍的事情,重新使用一个窗口但改变它的某些部分,但我在谷歌的旅行中没有找到太多。可能我没找对地方...

最佳答案

我认为您应该查看 VisualTree对于内容,而不是您的LogicalTree .

此外,我无法从您上面的问题中真正看出,但听起来您可能正在为您的内容寻找 ContentTemplate。如果是这种情况,它将不起作用,因为它是一个模板,因此它实际上并不包含内容。这就像查看 Cookie Cutter 以找到 Cookie。

附带说明一下,我更喜欢使用 DataTemplates 而不是 DataTriggers。您也不需要 DataTemplateSelector

在我的 ParentViewModel 中,我将拥有这样的属性:

private ViewModelBase _currentContent;
public ViewModelBase CurrentContent
{
get {return _currentContent;}
set
{
if (value != _currentContent)
{
_currentContent = value;
OnPropertyChanged("CurrentContent");
}
}
}

在 ParentViewModel 的 XAML 中,我会有类似的东西
<ContentControl Content="{Binding CurrentContent}" />

然后我会为不同的 subview 模型类型定义我的数据模板
<DataTemplate DataType="{x:Type local:SubViewModelA}">
<local:ViewA />
</DataTemplate>
<DataTemplate DataType="{x:Type local:SubViewModelB}" />
<local:ViewB />
</DataTemplate>
<DataTemplate DataType="{x:Type local:SubViewModelC}" />
<local:ViewC />
</DataTemplate>

要切换内容,我会更改主人的 CurrentContent应显示的任何 SubViewModel 的属性

关于c# - 我应该如何在 WPF 窗口中动态创建用户控件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5952804/

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