/ / DataTemplateおよびDataTemplateSelectorを使用して、ContentControlを介してプロパティにバインドする - wpf、data-binding、contentcontrol

DataTemplateとDataTemplateSelectorを使用してContentControl経由でプロパティにバインドする - wpf、data-binding、contentcontrol

これは私の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>

これが私のコントロールです(wpftoolkit data grid)

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

私のデータテンプレート ListStringDataTemplate データのデータグリッドを表示しない(型名を表示する)が、コントロールを使用する場合は注意してください。 <basic:ListValuesSearch MinHeight ="740" x:Name="ListValues" /> 直接データテンプレートセレクタなしでうまくいく。

私は問題はこの道だと思う ItemsSource= "{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ContentControl}, Path=OperatorValues, Mode=TwoWay}"

私はこれを解決することができます、私は間違っていますか?

ありがとう

t。

回答:

回答№1は0

DataTemplateSelectorを取り除き、DataTemplatesにDataTypeを指定しないのはなぜですか。それはずっと簡単で、ほとんどうまくいきます。

あなたのユーザーコントロールでは、あなたのバインディングはこのように見えるべきですが、PoDFinder.CodicePodがあなたのコレクションである場合だけです。そうでない場合は、プロパティにパスを追加する必要があります。

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