【问题标题】:Don't create new view each time with DataTemplate/DataType不要每次都使用 DataTemplate/DataType 创建新视图
【发布时间】:2014-04-15 20:08:35
【问题描述】:

我有这样的事情:

<Window>
    <Window.Resources>
       <DataTemplate DataType="{x:Type local:VM1}">
          <!-- View 1 Here -->
       </DataTemplate>

       <DataTemplate DataType="{x:Type local:VM2}">
          <!-- View 2 here -->
       </DataTemplate>
    <Window.Resources>

    <ContentPresenter Content="{Binding}"/>
</Window>

这会在我绑定不同的视图模型时自动换出视图,非常方便。

但是,我有一个带有选项卡控件和许多子视图的视图。每个子视图都有几个由自定义 xml 文件(复杂业务案例)配置的可视化部分。每次创建此视图时,都会解析 xml 文件,这会导致一小段(1-2 秒)延迟。延迟已经够烦人了,让 UI 感觉迟钝了。

有没有办法在每次绑定视图模型时使用 DataTemplate 模式而不破坏和重新创建视图?如果可能,我宁愿不更改视图模型。

【问题讨论】:

  • 您的问题缺少很多信息。为什么每次都解析xml文件? XML 文件数据如何影响您正在创建的视图?你能给出一个至少简化的场景吗?
  • 回答这个问题不需要这些。我不想重构视图或视图模型。我只是想问是否有一种方法可以使用 DataTemplates 而不会在每次绑定视图模型时破坏视图。

标签: c# wpf datatemplate


【解决方案1】:

对于这种情况,最简单的解决方案是让两个视图始终存在并更改哪个视图可见。您可以使用转换器根据数据上下文的类型更改可见性

<View1 Visibility="{Binding Converter={StaticResource TypeToVisibilityConverter, ConverterParameter=VM1}" />
<View2 Visibility="{Binding Converter={StaticResource TypeToVisibilityConverter, ConverterParameter=VM2}" />

并且转换器将检查类型是否与参数匹配以返回 Visible,否则返回 Collapsed。

【讨论】:

  • 此方法可能会导致具有大量绑定的复杂视图的一些性能问题。实际上,一旦视图变得可见并创建了可视化树,即使处于折叠状态,绑定也会被刷新。
【解决方案2】:

您可以将您的虚拟机包装到一个额外的类中。您的 DataTemplates 将决定 Wrapper 类的类型,但真正的实现将通过此 Wrapper 的属性公开。当这个属性发生变化时,DataTemplate 不会被重新加载,但所有的绑定都会被刷新。

包装类:

public class WrapperVM1:INotifyPropertyChanged
{
    public Content VM1 { get{...} set{...} }
}

public class WrapperVM2:INotifyPropertyChanged
{
    public Content VM2 { get{...} set{...} }
}

现在您的数据模板将描述包装类表示:

<DataTemplate DataType="{x:Type local:WrapperVM1}">
   <TextBlock Text={Binding Content.SomPropertyInVM1}"/>
</DataTemplate>

<DataTemplate DataType="{x:Type local:WrapperVM2}">
   <TextBlock Text={Binding Content.SomPropertyInVM2}"/>
</DataTemplate>

如您所见,如果将包装器的 Content 属性替换为新的 VM 实例,则不会重新创建视图,但所有绑定都会更新。但是,如果您需要切换到其他类型的 VM,则必须将 Wrapper 类替换为适当的 Wrapper。

【讨论】:

    猜你喜欢
    • 2014-07-29
    • 2011-09-11
    • 1970-01-01
    • 1970-01-01
    • 2021-03-09
    • 1970-01-01
    • 1970-01-01
    • 2013-01-17
    • 1970-01-01
    相关资源
    最近更新 更多