UWP MVVM XAML 动态 UserControl 管理器

3

我需要帮助改变视角。

我尝试像以前在WPF中使用MVVM模式管理UserControl动态加载的方法,但在UWP中遇到了各种困难,比如UWP不支持'x:Type'...

现在需要重新思考这个方法并寻找新的方向。看来我必须放弃类似于WPF模式中使用ContentPresenter的Content属性和VM属性(类型为Object),维护一个选定的ViewModel,以类似的方式使用隐式绑定。这是一种将正确的View自动匹配到ActiveViewModel中设置的VM的简单而干净的方法。

下面是管理许多视图的简单方法,可惜微软没有修复这个问题?但是,回到最重要的问题:在UWP中如何实现呢!?

<ContentPresenter Content="{Binding ActiveViewModel}">
    <ContentPresenter.Resources>
        <DataTemplate DataType="{x:Type local:OneViewModel}">
            <local:OneView />
        </DataTemplate>
        <DataTemplate DataType="{x:Type local:TwoViewModel}">
            <local:TwoView />
        </DataTemplate>
    </ContentPresenter.Resources>
</ContentPresenter>

我应该做什么才能代替这个?有人找到了一种新的有效方法吗?我的固执思想让我陷入了困境,需要有人踢我一下让我前进。我已经老了,但由于这个职业,似乎我不断地需要改变。

1个回答

1

查看DataTemplate文档,其中有一段解释你正在尝试解决的情况。

对于高级数据绑定场景,您可能希望将数据的属性确定应生成其UI表示的模板。 对于此场景,您可以使用DataTemplateSelector并设置诸如ItemTemplateSelector之类的属性以将其分配给数据视图。 DataTemplateSelector是您自己编写的逻辑类,它具有一个方法,该方法基于您与数据交互的自己的逻辑返回恰好一个DataTemplate给绑定引擎。 有关详细信息,请参见深入数据绑定。

这里有一个示例,介绍了如何根据定义的条件为控件中的项(例如ListView)选择不同的DataTemplate

您的情况与上述描述略有不同,但解决方案应在上述内容中。

  • 创建一个继承自 DataTemplateSelector 的类,并重写其公开的 SelectTemplateCore 方法,在其中定义特定呈现对象应选择哪个 DataTemplate 的逻辑。
  • 这个派生类应该公开类型为 DataTemplate 的属性,用来标识你想要从中选择的每个单独的 DataTemplate 模板对象。
  • 就像示例中一样,最好是在更高级别的对象(例如页面本身)上定义 DataTemplate 资源。
  • 在XAML中将你的 DataTemplateSelector 派生类实例化为资源,并将上面公开的每个类型为 DataTemplate 的属性设置为相应的 DataTemplate 静态资源。
  • 通过将其设置为自定义 DataTemplateSelector,利用 ContentTemplateSelector 依赖属性。

使用这种逻辑,你的 ContentPresenter 应该能够根据所需的 UI 逻辑正确地决定选择哪个 DataTemplate


1
André B 谢谢,我会看一下。我正在尝试找到最代码中立的通用 XAML(MVVM 友好)方法。我之前已经看过 @tiago-teixeira 的解决方案以及 链接(到目前为止我发现这是最令人满意的)。你的解决方案肯定解决了挑战的某些方面。 - Unfolded
抱歉,这是我第一次在StackOverflow上发表评论,但上面的链接是关于在_ContentTemplate_属性中使用_Converter_的。 - Unfolded
首先欢迎来到StackOverflow :) 是的,上面的链接非常有趣,但它与你的具体情况有些不同。 对于这些特定主题,实际上没有像其他主题那么多的信息,这是非常不幸的。你是否使用了ContentTemplateSelector依赖属性并取得了成功呢? - André B
谢谢! :) 我已经进行了有关模板选择的测试(基于转换器),但我对他提出的x:Bind实现不是很感兴趣。在我的示例中,WPF XAML中的绑定和演示同时发生。在这里(在UWP中),它要么是演示,要么是绑定。我希望有一个魔法子弹或有人说..不不不,你完全错了,应该这样做.. :) - Unfolded
André B,我将您的建议标记为有用(我认为这是正确的做法 - 如果您不同意,请告诉我)。我决定采用Magnus建议的稍微修改过的转换器方法。它对我的需求足够了。感谢您的贡献和参与,非常感激!干杯。 - Unfolded

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接