2013-01-11 78 views
1

我正在開發WPF項目,現在我正在致力於功能區RibbonGroup導致其子項丟失DataContext

絲帶的我在裏面有一定的控制,例如RibbonComboBoxRibbonTextBox

我在Ribbon幾個RibbonTab所以我設置一個視圖模型爲每個RibbonTab如下:

<rb:Ribbon Name="Ribbon"> 

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

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

因此,這些選項卡中的每個控件都會繼承其各自的視圖模型。

當我運行應用程序時,一切都按預期工作。當我將容器窗口調整爲非常小的尺寸時,問題開始:每個控件都會丟失它們的綁定,因爲它們的DataContext被一個名爲DisconnectedItem的對象所取代。

我已經做了一些研究,發現這是由於控件停止成爲可視樹的一部分,因此綁定引擎將其DataContext設置爲DisconnectedItem

我該怎麼做才能防止我的控件丟失DataContext

編輯:

我剛剛發現的主要問題來自於RibbonGroup控制,摺疊後使得其視覺孩子失去他們的DataContext。

+0

這很有趣!我沒有意識到它是你再問一次。我想通過我建議的鏈接沒有解決任何問題? – ChiefTwoPencils

+0

@ C.Lang是的,我無法解決它。實際上,在另一個問題中,我認爲錯誤的來源是'RibbonComboBox',但我只是意識到問題在於Ribbon本身,導致它的可視化子代在崩潰時失去DataContext。 – Dante

回答

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; 
     } 
    } 
} 
+0

我被困在這個問題上! Thx,這個解決方案適用於我。創建一個新的UserControl,繼承自RibbonGroup控件,並在後面的代碼中添加上面的代碼。然後我使用該控件作爲帶有Combobox的RibbonGroup。 ...完美地工作。一個恥辱MS沒有解決這個問題我讀過一些人認爲這個問題仍然存在於4.5框架中。 – PitAttack76

1

我通常爲所有功能區控件添加DataContext="{Binding Mode=OneTime}"行作爲解決方法,它可以完全解決問題。但是,您將不能多次更改DataContext