【问题标题】:Binding errors on ContentControl after changing Content before ContentTemplate is applied在应用 ContentTemplate 之前更改 Content 后 ContentControl 上的绑定错误
【发布时间】:2017-12-31 19:32:03
【问题描述】:

我遇到了一个烦人的问题,它并没有完全导致问题,但它会产生大量不必要的绑定错误。

我基本上将问题归结为这样一个事实,即在 ContentControl 上设置内容会在应用新的 ContentTemplate 之前更改其内容的 DataContext。由于新 Content 的类型与旧 ContentTemplate 预期的类型不同,因此它会从旧 ContentTemplate 生成绑定错误。

以下是我设置 ContentControl 的方式。 Content 绑定到所选选项卡的 ViewModel,ContentTemplate 绑定到 DataTemplate 以及该选项卡的 View。我曾经使用 ContentTemplateSelector 而不是带有 ContentTemplate 的转换器,但也有同样的问题,所以我尝试了这个。

<ContentControl Content="{Binding SelectedTab, Converter={StaticResource ConfigurationViewModelConverter}}" ContentTemplate="{Binding SelectedTab, Converter={StaticResource ConfigurationTemplateConverter}}"/>

也许我以某种方式将其连接错误,但除了切换选项卡时出现的绑定错误外,一切都运行良好,这似乎是由于 Content 和 ContentTemplate 暂时不同步。提前感谢您的任何帮助。

【问题讨论】:

  • 我无法用ContentTemplateSelector 重现该问题。你能提供一个MCVE吗?

标签: wpf xaml


【解决方案1】:

所以,我在这方面迟到了将近 2 年,但我在这个完全相同的问题上停留了大约一天,所以我想我会分享。我有 3 种视图模型对应于 3 个不同的 UserControls/DataTemplates。我使用了一种样式来解决这个问题

<ContentControl>
  <ContentControl.Resources>
    <DataTemplate x:Key="fooUc">
      <local:UC1 />
    </DataTemplate>
    <DataTemplate x:Key="barUc">
      <local:UC2 />
    </DataTemplate>
    <DataTemplate x:Key="bazUc">
      <local:UC3 />
    </DataTemplate>
  </ContentControl.Resources>
  <ContentControl.Style>
    <Style TargetType="ContentControl">
      <Style.Triggers>
        <!-- I'm assuming that SelectedTab is an int -->
        <DataTrigger Binding="{Binding SelectedTab}" Value="0">
          <Setter Property="Content" Value="{Binding FooVm}" />
          <Setter Property="ContentTemplate" Value="{DynamicResource fooUc}" />
        </DataTrigger>
        <DataTrigger Binding="{Binding SelectedTab}" Value="1">
          <Setter Property="ContentTemplate" Value="{DynamicResource barUc}" />
          <Setter Property="Content" Value="{Binding BarVm}" />
        </DataTrigger>
        <DataTrigger Binding="{Binding SelectedTab}" Value="2">
          <Setter Property="ContentTemplate" Value="{DynamicResource bazUc}" />
          <Setter Property="Content" Value="{Binding BazVm}" />
        </DataTrigger>
      </Style.Triggers>
    </Style>
  </ContentControl.Style>
</ContentControl>

上面要注意的关键是我的二传手的顺序。如果您的视图对象必须在视图模型对象之前更改,则将其放在之前,否则翻转顺序。问题是一个必须在另一个之前改变,它们不能同时改变。如果您的控件彼此完全不同,那么这仍然会产生错误(尽管不同!)。这对我有用,因为 BarVm 和 BazVm 有一个属性子集作为 FooVm。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多