使用C#与Wpf选项卡项控件循环



嗨,我熟悉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中学到的一切,理解并接受WPF心态

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

在WPF中,您不会"重置控件",实际上也不会对控件做太多操作,因为UI不是数据

相反,您所做的是声明性地将您的UI绑定到相关的数据模型

视图模型因此,比如定义一些数据:

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

然后定义(IN XAML)一段UI来显示该数据:

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

为了"清除"这些文本框,您需要将它们的DataContext分配给数据类的一个新的、清除的实例:

DataContext = new Person();

我建议你开始阅读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);
}
}
}

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

最新更新