別のコードとほぼ同じコードがあります-どちらも多かれ少なかれ、まったく同じテンプレートに従っています...
<Style TargetType="{x:Type controls:LookupControl}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type controls:LookupControl}">
<controls:AutoCompleteTextBox Margin="5,2,2,2"
EntityItemTemplate="{Binding RelativeSource={RelativeSource TemplatedParent},
Path=ItemTemplate,
Mode=TwoWay,
UpdateSourceTrigger=PropertyChanged}"
Items="{Binding RelativeSource={RelativeSource TemplatedParent},
Path=SearchResults}"
SelectAllOnFocus="True"
Text="{Binding RelativeSource={RelativeSource TemplatedParent},
Path=Text,
Mode=TwoWay,
UpdateSourceTrigger=PropertyChanged}"
Watermark="{Binding RelativeSource={RelativeSource TemplatedParent},
Path=Watermark,
Mode=TwoWay}"
Value="{Binding RelativeSource={RelativeSource TemplatedParent},
Path=Value,
Mode=TwoWay,
UpdateSourceTrigger=PropertyChanged}" />
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
と
<Style TargetType="{x:Type controls:SomeEntityControl}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type controls:SomeEntityControl}">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<TextBlock Grid.Row="0"
Margin="2"
Style="{DynamicResource InputTitle}"
Text="{Binding RelativeSource={RelativeSource TemplatedParent},
Path=Label,
Mode=TwoWay,
UpdateSourceTrigger=PropertyChanged}" />
<controls:AutoCompleteTextBox Grid.Row="1"
Margin="5,2,2,2"
DisplayMemberPath="Name"
Items="{Binding RelativeSource={RelativeSource TemplatedParent},
Path=SomeEntities}"
SearchMemberPath="Name"
SelectAllOnFocus="True"
Text="{Binding RelativeSource={RelativeSource TemplatedParent},
Path=Text,
Mode=TwoWay,
UpdateSourceTrigger=PropertyChanged}"
Value="{Binding RelativeSource={RelativeSource TemplatedParent},
Path=Value,
Mode=TwoWay,
UpdateSourceTrigger=PropertyChanged}">
<controls:AutoCompleteTextBox.EntityItemTemplate>
<DataTemplate DataType="{x:Type entities:SomeEntity}">
<TextBlock Text="{Binding Name}" />
</DataTemplate>
</controls:AutoCompleteTextBox.EntityItemTemplate>
</controls:AutoCompleteTextBox>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
それらはほとんど同じです-そして最初のものは私に問題を引き起こしているものです. Snoop ではすべてが正しくバインドされますが、何らかの理由で、(LookupControl の) Value は「ParentTemplate」ではなく「Local」にバインドされます。SomeEntityControl では、ParentTemplate に正常にバインドされています。
LookupControl の値の "AutoCompleteTextBox" は Local で null です。SomeEntityControl では、ParentTemplate です (少なくとも、まだ null ですが、何かが選択されるたびに変更されます)。
LookupControlには、Value を手動でオーバーライドして何かとして設定するものはありません。これは潜在的な問題になる可能性があります。私は何かを逃したかどうかに興味があります。TemplateBinding がどのように無視され、別のユーザーに適用されるのか理解できません...
さらに詳細を追加すると、SomeEntityControl の値は静的に SomeEntity に型付けされます。したがって、その Value プロパティは SomeEntity です。一方、それは Object 型です。オブジェクト型から文字列型に交換しようとしましたが、うまくいきませんでした。何らかの理由で、まだローカルにバインドされたままです。
(LookupControl 内)
public static readonly DependencyProperty ValueProperty =
DependencyProperty.Register("Value", typeof(object), typeof(LookupControl), new UIPropertyMetadata(null));
(SomeEntityControl 内)
public static readonly DependencyProperty ValueDependencyProperty =
DependencyProperty.Register("Value", typeof(SomeEntity), typeof(SomeEntityControl), new UIPropertyMetadata(null));
何かご意見は?スタイルが正しく設定されていることは確かです...バインドする必要があることはわかっています-LookupControlのValueプロパティのトレーサー/出力ウィンドウで問題が発生していることを示すエラー/例外はありません...
TemplateParent が見つからない場合、ローカルまたは何かに戻るという奇妙なエラーが発生する可能性があるかどうか疑問に思っています...?