1

我有选项卡控件,它有很多选项卡项,我在关闭选项卡项时检查数据网格项计数。第一次它工作正常(我的意思是在第一次迭代中)。关闭一个选项卡项目后,在第二次迭代中,sellDtg 为空。有谁知道为什么会这样?我担心这是 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'sContent已经通过了布局传递,并且是可见的。这意味着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);
}

如果您使用第二种方法,您可能会看到一次删除一个标签项,这可能是您不想看到的。

于 2013-03-26T18:58:56.410 回答