【问题标题】:Looping with Wpf tabitem Controls using C#?使用 C# 循环使用 Wpf tabitem 控件?
【发布时间】:2014-01-21 13:03:16
【问题描述】:

您好,我熟悉 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 中也能做到这一点。我对此有点困惑。请帮忙。

【问题讨论】:

  • 你想达到什么目的?
  • 我要清除控件中的数据

标签: c# wpf winforms recursion


【解决方案1】:

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

非常好。欢迎来到光明的一面。

你需要做的第一件事就是完全忘记你在winforms中学到的一切,理解并拥抱The WPF Mentality

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

在 WPF 中,您不会“重置控件”,实际上您并没有对控件做太多事情,仅仅是因为 UI is Not Data

您要做的是将您的 UI 以声明方式 DataBind 声明到相关的 Data ModelViewModel,然后对其进行操作。

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

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 Mentality 链接。

祝你好运。

【讨论】:

  • +1 优秀的文章。我确信@HighCore 不想弄乱答案,因为 WPF 中有很多内容要介绍,但是对于要响应的绑定,不要忘记在此示例 Person 中为类实现 INotifyPropertyChanged 并引发在 XAML 绑定中使用的属性上的 PropertyChanged 事件。
  • @Denismorozov 没错。 WPF 的功能远不止于此,但我发布的所有链接都应该让 OP 启动。
【解决方案2】:

您可以尝试使用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 的答案。

【讨论】:

  • @Pallavi 值得一提的是,由于UI Virtualization 和 WPF 内容模型以及 TabControl 创建和销毁 UI 元素的方式,这种方法存在各种问题动态和视觉与逻辑树。不要使用这种方法。 WPF 不是 winforms,请参阅我的回答。
  • 这里的根是什么。表项
  • @Pallavi 我还想重申@HighCore 所说的话。这种方法仅适用于可视化树在运行时不改变的非常简单的场景(即没有从ItemsControl 派生的控制)。如果您打算使用它,请仅将其作为临时解决方案,并考虑尽快将您的方法更改为正确的 MVVM 模型。
  • @Pallavi root 应该是您的窗口或任何其他顶级容器控件,包含您要“清除”的所有子控件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多