如何解决更改具有双向绑定的控件属性
我有一个带有bool属性的自定义控件。该属性通过Popup绑定包含模板控件。
XAML控件:
<controls:AutoCompleteTextBox x:Name="PART_Editor"
IsEnabled="False"
IsPopupOpen="{Binding IsAutocompletePopupOpen}" />
控件中的属性:
public bool IsPopupOpen
{
get => (bool)GetValue(IsPopupOpenProperty);
set => SetValue(IsPopupOpenProperty,value);
}
public static readonly DependencyProperty IsPopupOpenProperty =
DependencyProperty.Register("IsPopupOpen",typeof(bool),typeof(AutoCompleteTextBox),new FrameworkPropertyMetadata(false,FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));
绑定到包含在模板控件中的元素
<Popup x:Name="PART_AutoCompletePopup"
IsOpen="{Binding IsPopupOpen,RelativeSource={RelativeSource TemplatedParent},Mode=TwoWay}" />
我需要单击更改属性IsPopupOpen。我决定在行为上这样做,但我需要禁用控件。因此,我将行为添加到控件容器中
<Grid>
<controls:AutoCompleteTextBox x:Name="PART_Editor"
IsEnabled="False"
IsPopupOpen="{Binding IsAutocompletePopupOpen}"/>
<i:Interaction.Behaviors>
<behaviors:PopupContainerBehavior IsPopupOpen="{Binding IsAutocompletePopupOpen,Mode=TwoWay}" />
</i:Interaction.Behaviors>
</Grid>
行为代码:
public class PopupContainerBehavior : Behavior<UIElement>
{
public bool IsPopupOpen
{
get { return (bool)GetValue(IsPopupOpenProperty); }
set { SetValue(IsPopupOpenProperty,value); }
}
public static readonly DependencyProperty IsPopupOpenProperty =
DependencyProperty.Register("IsPopupOpen",typeof(PopupContainerBehavior),new PropertyMetadata(false));
protected override void OnAttached()
{
base.OnAttached();
AssociatedObject.PreviewMouseLeftButtonDown += OnMouseLeftButtonUp;
}
protected override void OnDetaching()
{
base.OnDetaching();
AssociatedObject.PreviewMouseLeftButtonDown -= OnMouseLeftButtonUp;
}
private void OnMouseLeftButtonUp(object sender,MouseButtonEventArgs e)
{
IsPopupOpen = true;
}
}
问题是该属性首先变为true,然后立即变为false。通过SNOOP,您可以通过该属性的闪烁值看到它。我认为问题出在TwoWay绑定中,但我不知道如何修复
解决方法
发生这种情况的原因是由于鼠标捕获。
- 行为的
PreviewMouseLeftButtonDown
事件处理程序告诉Popup
打开 - 弹出窗口捕获鼠标
- 其余的点击事件会触发容器
- 容器从
Popup
中夺走了鼠标
-
Popup
立即关闭
这可能是一个棘手的问题。
您可能要考虑使您的控件在Popup
被禁用时能够打开,而不是从外部尝试打开。即使控件被禁用,也可以通过在需要交互的部分上设置IsHitTestVisible
来使它的一部分可单击。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。