1

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

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

<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>

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

谢谢,亚历克斯。

4

1 回答 1

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-> 现在是控件的子项
  2. ListView“好吧DataTemplate,我可以按原样显示这个项目。” (因为它是一个视图,它不应该是)。
  3. ListView将项目(视图,它是 的子级ContentControl)添加到ItemsPanel.
  4. 哎呀!

但这可能不是它,WPF 应该比这更聪明,那么这个怎么样:对PathogensPresentViews列表中同一个实例的多个引用?

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

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

于 2012-08-28T23:53:26.643 回答