在为两个不同(几乎相同)的ViewModel重用View之后更正绑定错误

时间:2013-10-23 12:45:40

标签: wpf xaml mvvm binding

我有一个显示视频的视图。视频可以记录(在设备上)或下载(随后对其进行一些验证操作)。我们有一个ViewModel来表示每个州,尽管它们共享一个共同的ViewModel基类。

我们重复使用相同的视图,因为它们99%相同。下载的ViewModel有一些与验证相关的额外属性(无论是接受还是拒绝)。鉴于我们使用相同的视图,这会为录制的视频生成绑定错误。

我该如何解决这个问题?我原以为如果这些视觉元素是不可见的,它们就不会产生绑定错误(除非它们保存在录制内容中,否则它们是不可见的)

<StackPanel x:Name="ValidationHistory" Visibility="{Binding IsSavedRecording, Converter={StaticResource BoolToVisibilityConverter}, FallbackValue=Visible}">
    <StackPanel Visibility="{Binding HasAcceptedValidationSessions, Converter={StaticResource BoolToVisibilityConverter}, FallbackValue=Visible}">
        <TextBlock Text="{Binding NumberOfAcceptedValidationSessions, FallbackValue=0}"  />
    </StackPanel>
</StackPanel>

1 个答案:

答案 0 :(得分:0)

您可能想要使用的是DataTemplates。

非常粗略的描述

您可以为视图的相关部分创建两个模板,例如,包含StackPanel或不包含{。}}。

<DataTemplate x:Key="Template1" DataType="{x:Type m:ValidationHistoryViewModel}">
    <StackPanel x:Name="ValidationHistory">...*your critical binding*...</StackPanel>
</DataTemplate>

<DataTemplate x:Key="Template2" DataType="{x:Type m:OtherViewModel}">
</DataTemplate>

然后实现DataTemplateSelector,决定哪个ViewModel类型应该使用哪个模板(Template1或2)。

最后但并非最不重要的是,在您的视图中,您需要在相关位置使用<ContentPresenter>,并且可以将ContentPresenter s DataTemplateSelector配置为您的特定选择器。

这个(相当古老的)Tutorial将帮助您理解它,您需要改变的是您不使用项目列表而是一个项目,这就是您想要使用{{1 }} 为了这。官方MSDN resource也应该有所帮助。