Contentpresenter mit typbasierter Auswahl und Bindung von Datenvorlagen

Ich habe ein ItemsControl, das an eine Liste von Elementen gebunden ist. Diese Elemente haben eine Name- und eine Value-Eigenschaft. Die value -Eigenschaft ist vom Typ Object, damit verschiedene Datentypen verwendet werden können. Um die value-Eigenschaft korrekt anzuzeigen, verwende ich einen ContentPresenter mit einer Datenvorlage für jeden Datentyp, den ich möglicherweise verwende.

  <ItemsControl ItemsSource="{Binding Items}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="*"/>
                    <ColumnDefinition Width="Auto" />
                    <ColumnDefinition Width="*"/>
                </Grid.ColumnDefinitions>

                <TextBlock Text="{Binding Path=Name}"/>

                <GridSplitter Width="1" 
                              Grid.RowSpan="4" Grid.Column="1" 
                              HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/>

                <ContentPresenter Grid.Column="2" Content="{Binding Value}">
                    <ContentPresenter.Resources>
                        <DataTemplate DataType="{x:Type System:String}">
                            <TextBox Text="{Binding Path=Content, RelativeSource={RelativeSource AncestorType={x:Type ContentPresenter}}}" 
                                     BorderThickness="0"/>
                        </DataTemplate>
                        <DataTemplate DataType="{x:Type System:Int32}">
                            <TextBox Text="{Binding Path=Content, RelativeSource={RelativeSource AncestorType={x:Type ContentPresenter}}}" 
                                     TextAlignment="Right"
                                     BorderThickness="0"/>
                        </DataTemplate>
                        <DataTemplate DataType="{x:Type System:Double}">
                            <TextBox Text="{Binding Path=Content, RelativeSource={RelativeSource AncestorType={x:Type ContentPresenter}}}" 
                                     TextAlignment="Right"
                                     BorderThickness="0"/>
                        </DataTemplate>
                        <DataTemplate DataType="{x:Type System:Boolean}">
                            <CheckBox IsChecked="{Binding Path=Content, RelativeSource={RelativeSource AncestorType={x:Type ContentPresenter}}}"
                                          HorizontalAlignment="Center"/>
                        </DataTemplate>
                    </ContentPresenter.Resources>
                </ContentPresenter>
            </Grid>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

Der ContentPresenter verwendet den richtigen Datentyp und funktioniert hervorragend. Mein Problem ist, dass das Bearbeiten dieser Werte keine Auswirkungen auf die gebundenen Elemente hat. Ich vermute, dass dies daran liegt, dass ich mich an die content-Eigenschaft des ContentPresenter binde und nicht direkt an den Wert. Ich habe versucht, den ContentPresenter folgendermaßen zu verwenden:

<ContentPresenter Grid.Column="2" Content="{Binding}">
    <ContentPresenter.Resources>
        <DataTemplate DataType="{x:Type System:String}">
            <TextBox Text="{Binding Value}" 
                 BorderThickness="0"/>
        </DataTemplate>

Auf diese Weise wird jedoch nicht das richtige DataTemplate ausgewählt, sondern nur das Objekt anstelle eines Strings angezeigt. Ich habe auch versucht, den Pfad in der Bindung des DataTemplate so auszulassen:

 <DataTemplate DataType="{x:Type System:String}">
    <TextBox Text="{Binding}" BorderThickness="0"/>
 </DataTemplate>

In diesem Fall erhalte ich eine Ausnahme, die mich auffordert, das Pfad- oder XPath-Attribut zu verwenden.

Meine Frage lautet also: Wie binde ich richtig an den Wert, damit er mit dem richtigen DataTemplate angezeigt wird und jede Bearbeitung der Werte auf das gebundene Element angewendet wird.

Aus irgendeinem Grund werden die formatierten Codeblöcke in meiner Frage nach der ersten Zeile viel mehr eingerückt. Ich habe versucht, es zu reparieren, aber ich verstehe nicht, was passiert.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage