Don’t create new view each time with DataTemplate/DataType
我有这样的事情:
1
2 3 4 5 6 7 8 9 10 11 12 13 |
<Window> <Window.Resources> <DataTemplate DataType="{x:Type local:VM1}"> <!– View 1 Here –> </DataTemplate> <DataTemplate DataType="{x:Type local:VM2}"> <ContentPresenter Content="{Binding}"/> |
这会在我绑定不同的视图模型时自动换出视图,非常方便。
但是,我有一个带有选项卡控件和许多子视图的视图。每个子视图都有几个由自定义 xml 文件(复杂业务案例)配置的可视化部分。每次创建此视图时,都会解析 xml 文件,这会导致一小段(1-2 秒)延迟。延迟足够烦人并让 UI 感觉迟钝。
有没有办法在每次绑定视图模型时使用 DataTemplate 模式而不破坏和重新创建视图?如果可能,我宁愿不更改视图模型。
对于这种情况,最简单的解决方案是让两个视图始终存在并更改哪个视图可见。您可以使用转换器根据数据上下文的类型更改可见性
1
2 |
<View1 Visibility="{Binding Converter={StaticResource TypeToVisibilityConverter, ConverterParameter=VM1}" />
<View2 Visibility="{Binding Converter={StaticResource TypeToVisibilityConverter, ConverterParameter=VM2}" /> |
并且转换器将检查类型是否与参数匹配以返回 Visible,否则返回 Collapsed。
您可以将您的虚拟机package到一个额外的类中。您的 DataTemplates 将决定 Wrapper 类的类型,但真正的实现将通过此 Wrapper 的属性公开。当此属性发生更改时,不会重新加载 DataTemplate,但将刷新所有绑定。
package类:
1
2 3 4 5 6 7 8 9 |
public class WrapperVM1:INotifyPropertyChanged { public Content VM1 { get{…} set{…} } } public class WrapperVM2:INotifyPropertyChanged |
现在您的数据模板将描述package类表示:
1
2 3 4 5 6 7 |
<DataTemplate DataType="{x:Type local:WrapperVM1}"> <TextBlock Text={Binding Content.SomPropertyInVM1}"/> </DataTemplate> <DataTemplate DataType=" {x:Type local:WrapperVM2}"><TextBlock Text={Binding Content.SomPropertyInVM2}"/> </DataTemplate> |
如您所见,如果将package器的 Content 属性替换为新的 VM 实例,则不会重新创建视图,但所有绑定都会更新。但是,如果您需要切换到其他类型的 VM,则必须将 Wrapper 类替换为适当的 Wrapper。
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/tech/269591.html