/ / Bindung an eine Eigenschaft über ein ContentControl, mithilfe eines DataTemplate und DataTemplateSelector - wpf, Datenbindung, Contentcontrol

Bindung an eine Eigenschaft über ein ContentControl mithilfe von DataTemplate und DataTemplateSelector - wpf, Datenbindung, Inhaltssteuerung

das ist mein xaml

    <Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:basic="clr-namespace:Emule.GUI.Design.Templates"
xmlns:Search="clr-namespace:Emule.GUI.Features.Search"
xmlns:Finder="clr-namespace:Emule.GUI.Util.Finder"mc:Ignorable="d"
x:Class="Emule.GUI.Features.Search.View" Title="View" Height="454" Width="696">

 <!-- Default DataTemplate -->
<DataTemplate x:Key="DefaultDataTemplate">
<TextBox Grid.Row="2"  Grid.Column="2" x:Name="joe"
Visibility="{Binding OperatorValueVisibility, Mode=OneWay}"
Text="{Binding OperatorValue, UpdateSourceTrigger=PropertyChanged}" />
</DataTemplate>

<!-- DataTemplate for string list -->
<DataTemplate x:Key="ListStringDataTemplate">
<basic:ListValuesSearch MinHeight ="740" x:Name="ListValues" />
</DataTemplate>

<!-- DataTemplate Selector -->

<Search:PropertyDataTemplateSelector  x:Key="templateSelector"
DefaultDataTemplate="{StaticResource DefaultDataTemplate}"
BooleanDataTemplate="{StaticResource BooleanDataTemplate}"
EnumDataTemplate="{StaticResource EnumDataTemplate}"/>

<StackPanel Grid.Row="2" Grid.Column="2" HorizontalAlignment="Left" >
<ContentControl ContentTemplateSelector="{StaticResource templateSelector}"
Content="{Binding Path=PoDFinder.CodicePod}" />
</StackPanel>

</Window>

und dies ist mein Steuerelement

<UserControl x:Class="Emule.GUI.Design.Templates.ListValuesSearch"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:WpfToolkit="http://schemas.microsoft.com/wpf/2008/toolkit"

xmlns:Finder="clr-namespace:Emule.GUI.Util.Finder">

<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="DataGrid.Generic.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</UserControl.Resources>

<StackPanel>
<WpfToolkit:DataGrid ItemsSource= "{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ContentControl},
Path=OperatorValues, Mode=TwoWay}" x:Name="ListValuesSearchControl">

<WpfToolkit:DataGrid.Columns >
<WpfToolkit:DataGridTextColumn Header="Lista valori" Width="Auto" Binding="{Binding Path=Item}"/>
</WpfToolkit:DataGrid.Columns>
</WpfToolkit:DataGrid>
</StackPanel>

</UserControl>

meine Datenvorlage ListStringDataTemplate Zeigen Sie nicht das Daten-Datagrid (zeigen Sie den Typnamen an), beachten Sie jedoch, dass ich das Steuerelement verwende <basic:ListValuesSearch MinHeight ="740" x:Name="ListValues" /> direkt ohne Datenvorlagenauswahl funktionieren einwandfrei.

Ich denke, das Problem ist dieser Weg ItemsSource= "{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ContentControl}, Path=OperatorValues, Mode=TwoWay}"

Ich kann das lösen, was ich falsch liege?

Vielen Dank

t.

Antworten:

0 für die Antwort № 1

Warum nicht den DataTemplateSelector loswerden und den Datentyp in Ihren DataTemplates angeben? Es ist viel einfacher und fast zu arbeiten.

in Ihrem usercontrol sollte Ihre Bindung so aussehen, aber nur wenn PoDFinder.CodicePod Ihre Sammlung ist. Wenn nicht, müssen Sie den Pfad zur Eigenschaft hinzufügen.

<StackPanel>
<WpfToolkit:DataGrid ItemsSource="{Binding}">
<WpfToolkit:DataGrid.Columns>
<WpfToolkit:DataGridTextColumn Header="Lista valori" Width="Auto" Binding="{Binding Path=Item}"/>
</WpfToolkit:DataGrid.Columns>
</WpfToolkit:DataGrid>
</StackPanel>