我正在开发 WPF 项目,现在我正在处理功能区。
功能区内部我有一些控件,例如RibbonComboBox
,RibbonTextBox
等。
我的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。
答案 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;
}
}
}