C# 迭代TabControl中的TabItems

C# 迭代TabControl中的TabItems,c#,wpf,button,tabs,automation,C#,Wpf,Button,Tabs,Automation,我有一个tabcontrol,里面有9个tabitems。每个选项卡都有一系列文本框供用户输入数据。底部有一个与此方法连接的清除按钮: public void ClearTextBoxes() { ChildControls ccChildren = new ChildControls(); foreach (object o in ccChildren.GetChildren(rvraDockPanel, 2)) {

我有一个tabcontrol,里面有9个tabitems。每个选项卡都有一系列文本框供用户输入数据。底部有一个与此方法连接的清除按钮:

public void ClearTextBoxes()
    {
        ChildControls ccChildren = new ChildControls();

        foreach (object o in ccChildren.GetChildren(rvraDockPanel, 2))
        {
            if (o.GetType() == typeof(WatermarkTextBox) || o.GetType() == typeof(DateBox) ||
                o.GetType() == typeof(DigitBox) || o.GetType() == typeof(PhoneBox))
            {
                WatermarkTextBox water = (WatermarkTextBox)o;
                water.Text = "";
            }
            else if (o.GetType() == typeof(ComboBox))
            {
                ComboBox combo = (ComboBox)o;
                combo.SelectedIndex = -1;
            }
            else if (o.GetType() == typeof(CheckBox))
            {
                CheckBox check = (CheckBox)o;
                check.IsChecked = false;
            }
        }
    }
这非常好,但是我还有一个菜单项,允许用户清除所有选项卡。现在,“清除”按钮只清除当前选定选项卡上的内容,而不清除其他内容。我的想法是使用以下循环遍历tabitems:

        for (int i = 0; i < 10; i++ )
        {
            tabSelection.SelectedIndex = i;
            clearButton_Click(null, null);
        }
for(int i=0;i<10;i++)
{
tabSelection.SelectedIndex=i;
clearButton\u单击(空,空);
}
它将翻转所有选项卡,但不会清除任何内容。我尝试过用自动化来代替,结果是一样的。这似乎什么都不清楚

ChildControls类:

class ChildControls
{
private List<object> listChildren;

public List<object> GetChildren(Visual p_vParent, int p_nLevel)
{
    if (p_vParent == null)
    {
        throw new ArgumentNullException("Element {0} is null!", p_vParent.ToString());
    }

    this.listChildren = new List<object>();

    this.GetChildControls(p_vParent, p_nLevel);

    return this.listChildren;

}

private void GetChildControls(Visual p_vParent, int p_nLevel)
{
    int nChildCount = VisualTreeHelper.GetChildrenCount(p_vParent);

    for (int i = 0; i <= nChildCount - 1; i++)
    {
        Visual v = (Visual)VisualTreeHelper.GetChild(p_vParent, i);

        listChildren.Add((object)v);

        if (VisualTreeHelper.GetChildrenCount(v) > 0)
        {
            GetChildControls(v, p_nLevel + 1);
        }
    }
}
类子控件
{
儿童私人名单;
公共列表GetChildren(可视p_vParent,int p_nLevel)
{
if(p_vParent==null)
{
抛出新ArgumentNullException(“元素{0}为null!”,pvparent.ToString());
}
this.listChildren=新列表();
这个.GetChildControls(p_vParent,p_nLevel);
归还此文件。列出儿童;
}
私有void GetChildControls(可视p_vParent,int p_nLevel)
{
int nChildCount=VisualTreeHelper.GetChildrenCount(p_vParent);
对于(int i=0;i 0)
{
GetChildControls(v,p_nLevel+1);
}
}
}

}

要使代码正常工作,需要在清理方法中添加以下行:

        tabControl.SelectedIndex = i;
-->        UpdateLayout();
        Button_Click(null, null);
UpdateLayout方法负责绘制TabItem,并且VisualTree随后可用


一般来说,这种方法并不好,如果您有一个真正的应用程序,后面有业务数据,我建议您看看databinding/MVVM。方法不应该是在视图中重置控件,而是在后台重置绑定的业务数据。

WPF丢弃未选中的
TabItem
的整个
VisualTree
,因此在不可见的选项卡上实际上不存在控件


要维护控制值(如选择、文本等),它们需要绑定到某个对象。如果它们绑定到某个对象,那么您的
Clear()
方法实际上应该清除绑定值,而不是UI值。如果它们没有绑定到任何东西,则选中时
TabControl
将恢复到其初始状态。

我认为这与TabControl的WPF行为有关。我已经读到,当一个标签消失在视野之外时,上一个标签的可视树就会被“破坏”。您可能需要将Clear()抽象为类。谢谢您的帮助。我一直在尝试更多地理解MVVM,但不确定从哪里开始。你能推荐一些入门指南/书籍吗?不客气。只要在这里搜索一下,你就会发现很多推荐信。。经过一天的努力,终于找到了解决方案。当你想要找到一个控件时,Winforms与wpf相比是如此的容易!我将斯文的评论作为答案,因为它在这种情况下确实有效。不过我还是把你的投了赞成票,因为这让我开始真正理解MVVM是如何工作的,并且看到它会变得多么容易。我在想我的下一个主要项目是将我拥有的东西转换成MVVM。