【问题标题】:WPF: Can not find the Trigger target 'cc'. The target must appear before any Setters, TriggersWPF:找不到触发目标“cc”。目标必须出现在任何 Setter、Triggers 之前
【发布时间】:2010-12-17 18:46:57
【问题描述】:

以下代码有什么问题?

我在编译期间收到此错误:

属性“TargetName”不代表“Setter”的有效目标,因为未找到名为“cc”的元素。确保在使用它的任何设置器、触发器或条件之前声明目标。

我必须如何重构我的代码才能编译它而不会出错?

我只想切换一个 DataTrigger 绑定到我的 PersonViewModel 中的值的数据模板!

 <ContentControl x:Name="cc" Grid.Column="1">
            <DataTemplate>
                <DataTemplate.Triggers>
                    <DataTrigger Binding="{Binding Path=CurrentPersonViewModel.IsNew}" Value="True">
                        <Setter TargetName="cc" Property="ContentTemplate" Value="{DynamicResource NewPersonId}" />
                    </DataTrigger>
                    <DataTrigger Binding="{Binding Path=CurrentPersonViewModel.IsNew}" Value="False">
                        <Setter TargetName="cc" Property="ContentTemplate" Value="{DynamicResource SelectedPersonId}" />
                    </DataTrigger>
                </DataTemplate.Triggers>
            </DataTemplate>
        </ContentControl>

【问题讨论】:

  • 这看起来不对。您不会将DataTemplate 作为Content 添加到ContentControl。我认为您在设置模板后不能(轻松)切换模板?相反,您可以根据DataContext 中的数据切换一个模板内内容的可见性以显示/隐藏部分内容。

标签: wpf datatrigger contentcontrol


【解决方案1】:

更新

您可以为 ContentControl 使用 Style 并从那里更改 ContentTemplate

<ContentControl Name="cc" Grid.Column="1">
    <ContentControl.Style>
        <Style TargetType="ContentControl">
            <Setter Property="ContentTemplate" Value="{DynamicResource SelectedPersonId}"/>
            <Style.Triggers>
                <DataTrigger Binding="{Binding Path=CurrentPersonViewModel.IsNew}" Value="True">
                    <Setter Property="ContentTemplate" Value="{DynamicResource NewPersonId}" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </ContentControl.Style>
</ContentControl>

更新
我不明白为什么 DataTemplate 中的视图不继承 DataContext。通过使用它可以工作,但我不明白为什么这是必要的

<DataTemplate x:Key="NewPersonId">
    <local:NewPersonView DataContext="{Binding RelativeSource={RelativeSource AncestorType={x:Type ContentControl}}, Path=DataContext.CurrentPersonViewModel}" />
</DataTemplate>

<DataTemplate x:Key="SelectedPersonId">
    <local:SelectedPersonView DataContext="{Binding RelativeSource={RelativeSource AncestorType={x:Type ContentControl}}, Path=DataContext.SelectedPersonViewModel}"/>
</DataTemplate>

【讨论】:

  • 是的 Meleak 我也找到了相同的链接,但我对那里使用的两个 ContentControls 完全感到困惑。只是不明白为什么......我明天会测试它并让你们知道!
  • @List:我同意。检查我更新的答案,而不是从 ContentControl 执行此操作
  • @Lisa:我同意。我也在我链接的问题中做了一个回答,因为接受的答案在应该如何完成方面存在一些误导
  • @Meleak 是的,另一个线程中的那个人也使用了样式。我尝试了您的代码并将其放入我的测试项目中,但是 DataTemplate 永远不会切换? => sendspace.com/file/a427u1 自己检查一下,也许我忽略了什么......
  • @Lisa:ContentControl 没有 DataContext,所以它没有什么可以绑定的。检查ctor。对于主窗口。它只有 'this.dataGrid1.DataContext = new PersonListViewModel();'所以 DataContext 不会被继承或为 ContentControl 设置
【解决方案2】:

您不需要整个 DataTrigger 的东西。

只需阅读本文以使您的 DataTemplateSelector 正常工作:

http://joshsmithonwpf.wordpress.com/2007/03/18/updating-the-ui-when-binding-directly-to-business-objects-that-are-modified/

【讨论】:

    猜你喜欢
    • 2011-05-04
    • 2011-04-25
    • 1970-01-01
    • 1970-01-01
    • 2014-09-25
    • 1970-01-01
    • 2012-08-02
    • 2014-01-07
    • 2012-11-08
    相关资源
    最近更新 更多