FocusManager破坏了WPF数据绑定 - 为什么?

时间:2015-06-05 22:41:20

标签: wpf xaml data-binding

我花了最近几天来追踪这个错误。我的绑定被分离了,我不明白为什么。我希望我的一个文本框在我的应用程序启动时具有焦点。所以我使用了一个附加属性来设置聚焦元素。我的一些数据绑定已停止工作。

出于某种原因,只需重新安排我的XAML就会导致bug消失。

举个例子:

<StackPanel>
    <TextBox Text="{Binding Tb1}"/>
    <TextBox Text="{Binding Tb2}"/>
    <TextBox Text="{Binding Tb3}" 
           FocusManager.FocusedElement="{Binding RelativeSource={RelativeSource Self}}"/>
    <TextBox Text="{Binding Tb4}"/>
</StackPanel>

Tb1,Tb2和Tb3的绑定都有效。 Tb4绑定被破坏。如果我交换最后两行,就像这样:

<StackPanel>
    <TextBox Text="{Binding Tb1}"/>
    <TextBox Text="{Binding Tb2}"/>
    <TextBox Text="{Binding Tb4}"/>
    <TextBox Text="{Binding Tb3}" 
           FocusManager.FocusedElement="{Binding RelativeSource={RelativeSource Self}}"/>
</StackPanel>

然后所有绑定工作正常。

出于某种原因,在XAML中设置焦点元素会导致其后的所有绑定中断。

有没有人见过这个?如果是这样,你知道为什么会这样吗?

1 个答案:

答案 0 :(得分:0)

我认为使用FocusManager.FocusedElement的正确方法是在可视树中更高的元素上设置附加属性:

<StackPanel FocusManager.FocusedElement="{Binding ElementName=firstButton}">
  <Button Name="firstButton" />
</StackPanel>

可能没有很好地支持在元素本身上设置附加属性。