使用C#与Wpf tabitem控件循环?

使用C#与Wpf tabitem控件循环?,c#,wpf,winforms,recursion,C#,Wpf,Winforms,Recursion,大家好,我熟悉windows窗体,现在我要启动WPF,在windows中,我用以下递归方法重置控件 internal void clrCntrls(Control cntrl) { if (cntrl.GetType() == typeof(TextBox)) { TextBox cntrl = (TextBox)cntrl; cntrl.Text = "";

大家好,我熟悉windows窗体,现在我要启动WPF,在windows中,我用以下递归方法重置控件

 internal  void clrCntrls(Control cntrl)
    {
        if (cntrl.GetType() == typeof(TextBox))
        {
            TextBox cntrl = (TextBox)cntrl;
            cntrl.Text = "";               
        }            
         else if (cntrl.GetType() == typeof(ComboBox))
        {
            ComboBox cntrl = (ComboBox)cntrl;
            cntrl.SelectedIndex = -1;
        }
        else
        {
            foreach (Control subCntrl in _cntrl.Controls)
            {
                clrCntrls(subCntrl);
            }
        }
它在windows中对我来说很好,但在WPF中我也可以这样做。我对此有点困惑。请帮忙

我熟悉windows窗体,现在我要启动WPF

好极了。欢迎来到光明面

你需要做的第一件事是完全忘记你在winforms中学到的一切,理解并接受它

在winforms中,我使用以下递归方法重置控件

 internal  void clrCntrls(Control cntrl)
    {
        if (cntrl.GetType() == typeof(TextBox))
        {
            TextBox cntrl = (TextBox)cntrl;
            cntrl.Text = "";               
        }            
         else if (cntrl.GetType() == typeof(ComboBox))
        {
            ComboBox cntrl = (ComboBox)cntrl;
            cntrl.SelectedIndex = -1;
        }
        else
        {
            foreach (Control subCntrl in _cntrl.Controls)
            {
                clrCntrls(subCntrl);
            }
        }
在WPF中,您不会“重置控件”,实际上也不会对控件做太多的操作,原因很简单

相反,您要做的是将您的UI声明为相关的数据模型视图模型,并对其进行操作

因此,假设定义一些数据,如:

public class Person
{
    public string FirstName {get;set;}

    public string LastName {get;set;}
}
然后在XAML中定义()一块UI来显示数据:

  <StackPanel>
      <TextBlock Text="{Binding LastName}"/>
      <TextBlock Text="{Binding FirstName}"/>
   </StackPanel>

要“清除”这些文本框,您要做的是将它们分配给数据类的一个新的、清除的实例:

DataContext=newperson()

我建议你开始阅读WPF心理链接

祝你好运

我熟悉windows窗体,现在我要启动WPF

好极了。欢迎来到光明面

你需要做的第一件事是完全忘记你在winforms中学到的一切,理解并接受它

在winforms中,我使用以下递归方法重置控件

 internal  void clrCntrls(Control cntrl)
    {
        if (cntrl.GetType() == typeof(TextBox))
        {
            TextBox cntrl = (TextBox)cntrl;
            cntrl.Text = "";               
        }            
         else if (cntrl.GetType() == typeof(ComboBox))
        {
            ComboBox cntrl = (ComboBox)cntrl;
            cntrl.SelectedIndex = -1;
        }
        else
        {
            foreach (Control subCntrl in _cntrl.Controls)
            {
                clrCntrls(subCntrl);
            }
        }
在WPF中,您不会“重置控件”,实际上也不会对控件做太多的操作,原因很简单

相反,您要做的是将您的UI声明为相关的数据模型视图模型,并对其进行操作

因此,假设定义一些数据,如:

public class Person
{
    public string FirstName {get;set;}

    public string LastName {get;set;}
}
然后在XAML中定义()一块UI来显示数据:

  <StackPanel>
      <TextBlock Text="{Binding LastName}"/>
      <TextBlock Text="{Binding FirstName}"/>
   </StackPanel>

要“清除”这些文本框,您要做的是将它们分配给数据类的一个新的、清除的实例:

DataContext=newperson()

我建议你开始阅读WPF心理链接


祝您好运。

您可以尝试使用
VisualTreeHelper
,但它只适用于当前在可视化树中的控件,即渲染控件。如果您有一个
TabControl
,您将无法访问当前未选中的
TabItem
上的控件

下面是一个快速尝试:

private void ClearControls(DependencyObject root)
{
    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(root); i++)
    {
        var control = VisualTreeHelper.GetChild(root, i);

        if (control is TextBox)
        {
            (control as TextBox).Text = String.Empty;
        }
        else if (control is ComboBox)
        {
            (control as ComboBox).Text = String.Empty;
        }
        else if (VisualTreeHelper.GetChildrenCount(control) > 0)
        {
            ClearControls(control);
        }
    }
}
private void ClearControls(DependencyObject根)
{
for(int i=0;i0),则为else
{
ClearControls(控制);
}
}
}

我的建议是利用MVVM模式。在这种情况下,将控件内容绑定到视图模型类中的属性。要清除这种情况下的所有控件,只需将
DataContext
替换为视图模型类的新实例。查看HighCore的答案了解详细信息。

您可以尝试使用
VisualTreeHelper
,但它仅适用于当前在视觉树中的控件,即渲染控件。如果您有一个
TabControl
,您将无法访问当前未选中的
TabItem
上的控件

下面是一个快速尝试:

private void ClearControls(DependencyObject root)
{
    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(root); i++)
    {
        var control = VisualTreeHelper.GetChild(root, i);

        if (control is TextBox)
        {
            (control as TextBox).Text = String.Empty;
        }
        else if (control is ComboBox)
        {
            (control as ComboBox).Text = String.Empty;
        }
        else if (VisualTreeHelper.GetChildrenCount(control) > 0)
        {
            ClearControls(control);
        }
    }
}
private void ClearControls(DependencyObject根)
{
for(int i=0;i0),则为else
{
ClearControls(控制);
}
}
}

我的建议是利用MVVM模式。在这种情况下,将控件内容绑定到视图模型类中的属性。要清除这种情况下的所有控件,只需将
DataContext
替换为视图模型类的新实例。查看HighCore的答案了解详细信息。

您想要实现什么?我想要清除控件中的数据您想要实现什么?我想要清除控件中的数据+1出色的记录。我确信@HighCore不想把答案弄得乱七八糟,因为WPF中有很多内容要介绍,但是对于要响应的绑定,不要忘记在这个示例中,
Person
,类要实现INotifyPropertyChanged,并在XAML绑定中使用的属性上引发PropertyChanged事件。@Denismorzov没错。WPF的内容远不止这些,但我发布的所有链接都应该让OP开始了。+1精彩的评论。我确信@HighCore不想把答案弄得乱七八糟,因为WPF中有很多内容要介绍,但是对于要响应的绑定,不要忘记在这个示例中,
Person
,类要实现INotifyPropertyChanged,并在XAML绑定中使用的属性上引发PropertyChanged事件。@Denismorzov没错。WPF的内容远不止这些,但我发布的所有链接都应该让OP开始。@Pallavi值得一提的是,由于
UI虚拟化
和WPF内容模型以及TabControl动态创建和销毁UI元素的方式,这种方法存在各种各样的问题