RibbonGroup导致其子项丢失其DataContext

时间:2013-01-11 18:49:30

标签: c# wpf ribbon

我正在开发 WPF 项目,现在我正在处理功能区

功能区内部我有一些控件,例如RibbonComboBoxRibbonTextBox等。

我的RibbonTab中有几个Ribbon,因此我为每个RibbonTab设置了一个视图模型,如下所示:

<rb:Ribbon Name="Ribbon">

        <rb:RibbonTab Header="Tab One" Name="tab1">

            <rb:RibbonTab.DataContext>
                <vm:TabOneViewModel />
            </rb:RibbonTab.DataContext>

因此,这些选项卡中的每个控件都会继承其各自的视图模型。

当我运行应用程序时,一切都按预期工作。在执行此操作后,我将容器窗口的大小调整为非常小的大小时会出现问题: 每个控件都会丢失绑定,因为它们的DataContext被名为DisconnectedItem的对象替换。 < / em>的

我做了一些研究,发现这是由于控件停止成为可视树的一部分,因此绑定引擎将其DataContext设置为DisconnectedItem

如何防止我的控件丢失DataContext

修改

我刚刚发现主要问题来自RibbonGroup控制,在崩溃后导致其视觉儿童丢失其DataContext。

2 个答案:

答案 0 :(得分:1)

我通常会为所有功能区控件添加DataContext="{Binding Mode=OneTime}"行作为解决方法,从而完全解决问题。您将无法多次更改DataContext

答案 1 :(得分:1)

我刚刚找到了RibbonGroup控制问题here

的解决方法

我采取的解决方案是创建一个继承自RibbonGroup控件的新控件。

    public class MyRibbonGroup : RibbonGroup
    {
    public MyRibbonGroup() 
        : base()
    {
    }

    protected override void OnPropertyChanged(DependencyPropertyChangedEventArgs e)
    {
        base.OnPropertyChanged(e);

        // Force the bindings to be restored after 
        // the ribbon group collapsed or expanded to a menu button.
        if (e.Property == RibbonGroup.IsCollapsedProperty)
        {
            object objDataContext = this.DataContext;
            this.DataContext = null;
            this.DataContext = objDataContext;
        }
    }
}