在C#wpf中如何遍历网格并获取网格内的所有标签

时间:2014-04-01 18:53:23

标签: c# wpf

所以你知道在c#中如何使用普通形式,你可以循环一个面板并获取其中的所有标签? 所以你可以这样做:

foreach(Label label in Panel.Controls)

有没有办法为网格做到这一点?

之类的东西
foreach(Lable lable in Grid)

所以这个foreach可以在一个传递网格对象的函数中,如此

private void getLabels(Grid myGrid)
{
  foreach(Label label in myGrid)
}

如果我这样做,它告诉我“错误CS1579:foreach语句不能对'System.Windows.Controls.Grid'类型的变量进行操作,因为'System.Windows.Controls.Grid'不包含'的公共定义'的GetEnumerator'“

我现在知道的另一种做法吗?

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:4)

normal forms - WPF使用正常方式在2014年进行.Net Windows用户界面。

如果你正在使用WPF,你需要留下你从古代技术中获得的任何和所有概念,并理解并拥抱The WPF Mentality

基本上,你不会在WPF中“迭代”任何东西,因为绝对没有必要这样做。

用户界面的责任是显示数据,而不是存储它,操纵它。因此,您需要显示的任何数据都必须存储在正确的数据模型或ViewModel中,并且UI必须使用正确的DataBinding来访问该数据,而不是程序代码。

所以,例如,假设您有一个Person类:

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

    public string FirstName {get;set;}
}

您需要将用户界面的DataContext设置为以下列表:

//Window constructor:
public MainWindow()
{
    //This is required.
    InitializeComponent();

    //Create a list of person
    var list = new List<Person>();

    //... Populate the list with data.

    //Here you set the DataContext.
    this.DataContext = list;
}

然后,您需要在ListBox或其他基于ItemsControl的用户界面中显示该内容:

<Window ...>
    <ListBox ItemsSource="{Binding}">

    </ListBox>
</Window>

然后您将要使用WPF的Data Templating功能来定义如何在UI中显示Person类的每个实例:

<Window ...>
   <Window.Resources>
      <DataTemplate x:Key="PersonTemplate">
          <StackPanel>
              <TextBlock Text="{Binding FirstName}"/>
              <TextBlock Text="{Binding LastName"/>
          </StackPanel>
      </DataTemplate>
   </Window.Resources>

   <ListBox ItemsSource="{Binding}"
            ItemTemplate="{StaticResource PersonTemplate}"/>
</Window>

最后,如果您需要在运行时更改数据,并在UI中反映这些更改(显示),那么您的DataContext类必须Implement INotifyPropertyChanged

public class Person: INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged(string name)
    {
        var handler = PropertyChanged;
        if (handler != null)
            handler(this, new PropertyChangedEventArgs(name));
    }

    private string _lastName;
    public string LastName
    {
        get { return _lastName; }
        set
        {
            _lastName = value;
            OnPropertyChanged("LastName");
        }
    }

    private string _firstName;
    public string FirstName
    {
        get { return _firstName; }
        set
        {
            _firstName = value;
            OnPropertyChanged("FirstName");
        }
    }
}

最后,您遍历List<Person>并更改数据项的属性,而不是操纵UI:

foreach (var person in list)
    person.LastName = "Something";

单独离开用户界面。

答案 1 :(得分:2)

通过Grid.Children迭代并将所有内容都转换为Label。如果它不为null,则表示您已找到标签。