1

私はWPFプロジェクトを開発していて、現在リボン領域に取り組んでいます。

リボンの内側にはRibbonComboBox、、などのコントロールがありますRibbonTextBox

私はいくつか持ってRibbonTabいるRibbonので、RibbonTabごとに次のように1つのビューモデルを設定します。

<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を失う原因となるコントロールに起因することがわかりました。

4

2 に答える 2

1

ここRibbonGroupで制御の問題の回避策を見つけました

私が取った解決策は、コントロールから継承する新しいコントロールを作成すること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;
        }
    }
}
于 2013-01-14T15:17:56.183 に答える
1

DataContext="{Binding Mode=OneTime}"私は通常、回避策としてすべてのリボンコントロールに行を追加します。これにより、問題が完全に修正されます。DataContextただし、複数回変更することはできません。

于 2013-01-12T00:00:44.357 に答える