我有一段几乎与另一段相同的代码——它们或多或少都遵循相同的模板……
<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 中正确绑定,但由于某种原因,Value(在 LookupControl 上)绑定到“Local”而不是“ParentTemplate”。在 SomeEntityControl 中,它成功绑定到 ParentTemplate。
LookupControl 的值中的“AutoCompleteTextBox”是 Local 和 null。在 SomeEntityControl 中,它是 ParentTemplate(至少仍然为 null ——但只要选择了某些东西,它就会改变)。
LookupControl中没有任何内容可以手动覆盖 Value 并将其设置为任何内容,这可能是一个潜在问题。我只是好奇我是否错过了什么。我不明白 TemplateBinding 如何被一个人忽略并被另一个人应用......
为了添加更多细节,SomeEntityControl 的值被静态输入到 SomeEntity——因此其上的 Value 属性是 SomeEntity。另一方面,它是对象类型。我尝试从类型 Object 交换到 string,但没有运气 - 由于某种原因,它仍然在本地绑定。
(在 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 属性的 Tracer/Output 窗口中出现问题......
我想知道是否存在一个奇怪的错误,即如果找不到 TemplateParent 它会恢复为本地或其他东西......?