1

多くのタブアイテムがあるタブコントロールがあります。タブアイテムを閉じるときにデータグリッドアイテム数をチェックしています。初めて正常に動作します(つまり、最初の反復で)。1つのタブ項目を閉じた後、2回目の反復でsellDtgはnullになります。なぜそれが起こっているのか誰かが知っていますか?これはUIの問題であり、レイアウトが更新されていないのではないかと心配しています。私を助けてください、または方向性を示してください。

while (tc.HasItems) 
        {
            TabItem ti = tc.SelectedItem as TabItem;
            if (ti.Header == "Продажа") 
            {
                Microsoft.Windows.Controls.DataGrid sellDtg = FindChild<Microsoft.Windows.Controls.DataGrid>(tc, "SellDataGrid");
                if (sellDtg.Items.Count > 0)
                {
                    Sell sl = new Sell();
                    if (Sell.basketfromSellDateListBox == false)
                    {
                        sl.ClearBasket(sellDtg);
                        Sell.ClearFromSellBasket((int)sellDtg.Tag);
                    }
                }
            }
            if (ti != null)
                tc.Items.Remove(ti);

        }

前もって感謝します!!!

4

2 に答える 2

1

私は以下FindChildLogicalの例えで簡単な関数を書きましたLogicalTreeHelper

public static T FindChildLogical<T>(DependencyObject parent, string childName)
           where T : DependencyObject
        {
            if (parent == null) return null;
            var child = LogicalTreeHelper.FindLogicalNode(parent, childName);

            return (T)child;
        }

そしてあなたはそれを次のように呼びます:

Microsoft.Windows.Controls.DataGrid sellDtg = FindChildLogical<Microsoft.Windows.Controls.DataGrid>(ti, "SellDataGrid");

私はそれがあなたが意図したところにあなたを連れて行くことを願っています。

于 2013-03-27T14:10:10.170 に答える
0

あなたのFindChildメソッドVisualTreeHelperがその子を見つけるためにを使用すると仮定します。

最初の反復では、TabItem'Contentはレイアウトパスを通過しており、表示されています。これは、TabItem'Contentがビジュアルツリーに含まれることを意味します。

ただし、他のタブアイテムについてはContent、レイアウトパスを通過しておらず(親が選択されたときにのみビジュアルツリーに追加され、レイアウト/レンダリングパスを通過する必要があります)、通過しません。ビジュアルツリーにあります。

TabItem選択したタブとしてレイアウトパスを通過していないの子コンテンツを取得するには、いくつかの方法があります。

1)を使用してLogicalTreeHelper、探しているものを見つけることがGridできます(おそらくContentTabItemではなく、のを検索する必要がありますTabControl)。

2)コードをwhileループから外し、Loaded優先度でディスパッチャーに対してコールバックを実行できます。

void RemoveAllItems()
{
    if (!tc.HasItems) return;

    TabItem ti = tc.SelectedItem as TabItem;
    if (ti.Header == "Продажа") 
    {
        var sellDtg = FindChild<Microsoft.Windows.Controls.DataGrid>(tc, "SellDataGrid");
        if (sellDtg.Items.Count > 0)
        {
            Sell sl = new Sell();
            if (Sell.basketfromSellDateListBox == false)
            {
                sl.ClearBasket(sellDtg);
                Sell.ClearFromSellBasket((int)sellDtg.Tag);
            }

            if (ti != null)
                tc.Items.Remove(ti);
        }
    }

    Dispatcher.BeginInvoke(new Action(RemoveAllItems), DispatcherPriority.Loaded);
}

2番目の方法を使用すると、一度に1つずつ削除されたタブ項目を表示できる可能性があります。これは、表示したくないものである可能性があります。

于 2013-03-26T18:58:56.410 に答える