WPF 绑定在父项折叠时中断



我正在使用 wpf 和 xaml 将可见性属性绑定到依赖项属性,但是当父对象折叠绑定中断时,我无法弄清楚原因。 如果我在父级折叠并再次可见后在代码中重新创建绑定,则该过程可以工作,但这很丑陋并且违背了绑定的目的。 下面是一个小型 wpf 项目,它将重现该问题。

<Window x:Class="RibbonExample.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:r="clr-namespace:Microsoft.Windows.Controls.Ribbon;assembly=RibbonControlsLibrary"
        Title="MainWindow" Height="350" Width="525" KeyDown="Window_KeyDown" KeyUp="Window_KeyUp">
    <Grid>
        <r:Ribbon Grid.Row="0" x:Name="xRibbon" Title="Ribbon Example">
            <r:RibbonTab x:Name="View" Header="Tab" IsSelected="True">
                <r:RibbonGroup Header="Visible">
                    <r:RibbonTextBox x:Name="xButton" Text="Visible Text" />
                </r:RibbonGroup>
                <r:RibbonGroup Header="Invisible" Visibility="{Binding VisibilityDependancy}">
                    <r:RibbonTextBox x:Name="xButton2" Text="{Binding VisibilityDependancy}" />
                </r:RibbonGroup>
            </r:RibbonTab>
        </r:Ribbon>
    </Grid>
</Window>

和代码隐藏。

using System.Windows;
using System.Windows.Input;
namespace RibbonExample
{
    public partial class MainWindow : Window
    {
        public static readonly DependencyProperty VisibilityDependancyProperty =
            DependencyProperty.Register("VisibilityDependancy", typeof(Visibility), typeof(MainWindow), new PropertyMetadata(Visibility.Collapsed));
        public MainWindow()
        {
            InitializeComponent();
            DataContext = this;
        }
        private void Window_KeyDown(object sender, KeyEventArgs e)
        {
            SetValue(VisibilityDependancyProperty, Visibility.Visible);
        }
        private void Window_KeyUp(object sender, KeyEventArgs e)
        {
            SetValue(VisibilityDependancyProperty, Visibility.Collapsed);
        }
    }
}

要重现简单的焦点窗口,请按一个键,折叠的RibbonGroup应该变得可见,然后在释放时它将隐藏。 如果通过双击选项卡标题"Tab"折叠功能区,然后将其恢复,则绑定将不再起作用,功能区组的可见性将保持折叠功能区之前的任何状态。

有趣的是,如果您执行 IsEnabled 并将其设置为 true 或 false,则绑定不会中断,仅当您在功能区后面绑定可见性时。

谢谢

绑定正在中断,因为在代码中,在键关闭事件的代码中,您通过调用SetValue方法显式设置依赖项属性的值。

相反,除了从代码隐藏中手动设置它之外,您应该使用SetCurrentValue以防您想要to retain your bindings

来自 MSDN for SetCurrentValue -

此方法由以编程方式设置 其自己的属性之一的值,而不禁用应用程序的 声明使用该物业。方法更改 属性的有效值,但现有触发器、数据绑定、 并且样式将继续有效。

最新更新