我最近在将一堆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>
在搜索这种异常之后,最常见的原因似乎是一些不正确的样式,但是在这个应用程序中我还没有设置任何元素的样式。有人可以告诉我可能导致此例外的原因吗?
谢谢, 亚历克斯。
答案 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元素时,可能会发生一些不受欢迎的事情:
DataTemplate
已创建:视图已添加到ContentControl
- &gt;现在是控件的孩子ListView
去“好了DataTemplate
,我可以按原样显示这个项目。”(因为它是一个视图,不应该是)。ListView
将项目(视图,ContentControl
的子项)添加到ItemsPanel
。但可能不是这样,WPF应该比那更聪明,那么怎么样:PathogensPresentViews
列表中对同一个实例的多次引用?
或者在两个地方使用相同的视图模型,创建两个视图,它们都试图显示相同的UI元素列表?
无论实际情况如何,你都不应该对抗症状而是疾病,这很可能是你的视图模型包含观点。