WPF指定元素已经是另一个元素的逻辑子元素。首先断开它

时间:2012-08-28 22:54:11

标签: wpf xaml .net-4.0

我最近在将一堆Specified element is already the logical child of another element. Disconnect it first."控件转换为更简单的Frame控件以在其逻辑父模型视图中托管子模型视图后,开始获取异常“ContentControl。” p>

在下面的示例中,注释掉的注释掉的代码将停止崩溃:

<UserControl x:Class="GUI.Views.Scenario.PathogenRiskLiquidIngestionView"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:ScenModels="clr-namespace:GUI.ViewModels.ScenarioModels">

    <StackPanel Orientation="Vertical">
        <StackPanel Orientation="Vertical">
            <DockPanel>
                <Label DockPanel.Dock="Left" Content="Risk Assessment Title"></Label>
                <TextBox DockPanel.Dock="Right" Text="{Binding RiskAssessmentTitle, ValidatesOnDataErrors=True, UpdateSourceTrigger=PropertyChanged}"></TextBox>
            </DockPanel>
            <DockPanel>
                <Label DockPanel.Dock="Left" Content="Risk Calculated"></Label>
                <ComboBox SelectedItem="{Binding RiskCalculated, ValidatesOnDataErrors=True, UpdateSourceTrigger=PropertyChanged}" ItemsSource="{Binding RiskCalculatedOptions}"></ComboBox>
            </DockPanel>
            <DockPanel>
                <Label DockPanel.Dock="Left" Content="{Binding MinAcceptableInfectionRiskLabel}"></Label>
                <TextBox DockPanel.Dock="Right" Text="{Binding MinAcceptableInfectionRisk, ValidatesOnDataErrors=True, UpdateSourceTrigger=PropertyChanged}"></TextBox>
            </DockPanel>
        </StackPanel>
        <!--<GroupBox Header="Pathogens">
            <StackPanel Orientation="Vertical">
                <StackPanel Orientation="Horizontal" HorizontalAlignment="Right">
                    <Button Content="Add Pathogen" Command="{Binding AddPathogen}"></Button>
                    <Button Content="Remove Pathogen" Command="{Binding RemovePathogen}" CommandParameter="{Binding SelectedIndex, ElementName=PathogenList}"></Button>
                </StackPanel>
                <ListView Name="PathogenList" ItemsSource="{Binding PathogensPresentViews}" Tag="{Binding}" BorderThickness="0" Background="Transparent">
                    <ListView.ItemTemplate>
                        <DataTemplate DataType="{x:Type ScenModels:PathogenPresentIngestViewModel}">
                            <ContentControl Content="{Binding}"></ContentControl>
                        </DataTemplate>
                    </ListView.ItemTemplate>
                </ListView>
            </StackPanel>
        </GroupBox>
        <GroupBox Header="Receptor Characteristics">
            <StackPanel Orientation="Vertical">
                <ContentControl Content="{Binding ReceptorVolumeLiquidIngestedPerEventView}"></ContentControl>
                <ContentControl Content="{Binding ExposuresView}"></ContentControl>
            </StackPanel>
        </GroupBox>-->
    </StackPanel>
</UserControl>

在搜索这种异常之后,最常见的原因似乎是一些不正确的样式,但是在这个应用程序中我还没有设置任何元素的样式。有人可以告诉我可能导致此例外的原因吗?

谢谢, 亚历克斯。

1 个答案:

答案 0 :(得分:2)

如果没有更多关于所有基础对象的知识,我就无法做多猜测......

这是真的可疑的东西:

<ListView Name="PathogenList" ItemsSource="{Binding PathogensPresentViews}" Tag="{Binding}" BorderThickness="0" Background="Transparent">
    <ListView.ItemTemplate>
        <DataTemplate DataType="{x:Type ScenModels:PathogenPresentIngestViewModel}">
            <ContentControl Content="{Binding}"></ContentControl>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

正如评论中提到的,您甚至不应该遇到绑定到*Views的情况,视图模型不应该引用视图,而应该只引用视图模型。如果违反它,那么遵循模型 - 视图 - 分离模式就没什么意义了。

无论如何,当你绑定到大概是视图和UI元素时,可能会发生一些不受欢迎的事情:

  1. DataTemplate已创建:视图已添加到ContentControl - &gt;现在是控件的孩子
  2. ListView“好了DataTemplate,我可以按原样显示这个项目。”(因为它是一个视图,不应该是)。
  3. ListView将项目(视图,ContentControl的子项)添加到ItemsPanel
  4. 糟糕!
  5. 但可能不是这样,WPF应该比那更聪明,那么怎么样:PathogensPresentViews列表中对同一个实例的多次引用?

    或者在两个地方使用相同的视图模型,创建两个视图,它们都试图显示相同的UI元素列表?

    无论实际情况如何,你都不应该对抗症状而是疾病,这很可能是你的视图模型包含观点。