1

私は最近、一連のコントロールをより単純なコントロールSpecified element is already the logical child of another element. Disconnect it first."に変換して、論理的な親モデルビュー内でサブモデルビューをホストした後、例外を取得し始めました。FrameContentControl

以下の例では、コメントアウトされたときにコメントアウトされたコードは、クラッシュの発生を停止します。

<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. ListViewContentControlアイテム(の子であるビュー)をに追加しますItemsPanel
  4. おっと!

しかし、それはおそらくそうではありません。WPFはそれよりも賢いはずなので、これはどうPathogensPresentViewsでしょうか。リスト内の同じインスタンスへの複数の参照?

または、同じビューモデルが2つの場所で使用され、2つのビューが作成され、どちらも同じUI要素のリストを表示しようとしますか?

実際のケースが何であれ、症状と戦うのではなく、病気と戦う必要があります。これは、ビューモデルにビューが含まれている可能性が高いです。

于 2012-08-28T23:53:26.643 に答える