【问题标题】:LostFocus event firing upon getting Focus获得焦点后触发 LostFocus 事件
【发布时间】:2013-08-30 11:54:18
【问题描述】:

我有一个绑定到对象集合的itemscontrol

在数据模板中,我绑定了一个动作,如果它们的焦点丢失,所有创建的控件都将使用该动作。

在控件中,有一个文本框,所以如果项目控件ItemSource中有1个项目,就会有2个文本框。

现在,如果文本框 1 具有焦点并且我单击文本框 2 以外的某个位置,则该操作将执行一次(因为焦点丢失了)。但是,如果我单击文本框 2,则该操作会执行两次。为什么?

<ItemsControl Grid.Row="1" Margin="0,5,0,5" ItemsSource="{Binding
        RelativeSource={RelativeSource FindAncestor,
        AncestorType={x:Type Window}}, Path=Collection}">
    <ItemsControl.ItemTemplate>
        <DataTemplate DataType="{x:Type ct:CollectionItem}">
            <cc:TestControl
                ValueChangedAction="{Binding
                    RelativeSource={RelativeSource FindAncestor,
                    AncestorType={x:Type Window}}, Path=ValueChangedAction}"
                VerticalAlignment="Center" HorizontalAlignment="Center" />
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

这是控件。

<ewt:DecimalUpDown  Tag="{Binding Uid}" Grid.Row="0" Grid.Column="3"
    HorizontalAlignment="Stretch" TextAlignment="Left" Margin="10,5,10,5"
    FormatString="C2"  ShowButtonSpinner="False" VerticalAlignment="Center"
    Value="{Binding Value}" LostFocus="DecimalUpDown_LostFocus" />

绑定的动作在这个事件处理程序中执行。

【问题讨论】:

  • 好的,你应该做什么?它是否以某种方式对绑定源采取行动(例如,绑定窗口发生了什么事情?)假设这个问题的答案是“是”,请参阅下面的答案。
  • DecimalUpDown 有问题的文本框吗?因为如果是这样,那么您的DecimalUpDown 可能会触发LostFocus 事件(请参阅您在ewt:DecimalUpDown 中发布的代码,有一个@LostFocus 属性),以及文本框——它是DecimalUpDown--你绑定的。

标签: c# wpf


【解决方案1】:

如果您的操作应该更新绑定的源(例如,窗口,它看起来像您的示例),您可能想尝试将 OneWayToSource 添加到您的绑定中,以便绑定仅以一种方式发生 - 从文本框绑定到任何内容。

【讨论】:

  • 基本上,该操作将更新 ItemsControl 的项目源。也就是说,如果有2个item,改变其中一个的textbox中的值,就是要更新另一个的textbox中的值
猜你喜欢
  • 2016-09-13
  • 1970-01-01
  • 2015-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-18
  • 2013-05-12
相关资源
最近更新 更多