父崩溃的WPF绑定中断

时间:2013-11-07 17:10:35

标签: c# wpf xaml data-binding

我正在使用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”折叠功能区然后将其重新启动,则绑定将不再起作用,RibbonGroup的可见性将保持在折叠功能区之前的状态。

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

由于

1 个答案:

答案 0 :(得分:0)

绑定正在破坏,因为在关键事件后面的代码中,您通过调用SetValue方法显式设置了Dependency Property的值。

相反,如果您希望SetCurrentValue除了从后面的代码手动设置to retain your bindings之外,您应该使用{{1}}。

来自MSDN的SetCurrentValue -

  

此方法由以编程方式设置的组件使用   在不禁用应用程序的情况下,其自身属性之一的值   宣布使用该财产。 SetCurrentValue方法改变了   有效的属性值,但现有的触发器,数据绑定,   和风格将继续有效。