似乎无法在我脑海中获得WPF DataBinding

时间:2011-03-21 19:42:01

标签: c# wpf data-binding

好吧,我不是编程或C#的新手,我似乎无法将WPF的数据绑定直接放在脑海中。我的同事们对此赞不绝口(是的,我也会问他们)但是现在我很难过。

以下是我想为初学者做的事情:

作为一个例子,我有一个的东西列表:

List<Thing> thingList = Source.getList();

现在通常我会去

foreach(Thing t in thingList)
{
    //add thing to combobox
}

但是我可以收集的是,我可以以某种方式不这样做但是使用数据绑定为我填充组合框。

我似乎无法得到我在哪里放置'thingList'?我是否将它作为一个单独的财产?我在哪里放这个房产?

此刻我觉得非常愚蠢,因为我现在已经挣扎了一段时间,而且我找不到任何让我理解这个 - 可能非常简单 - 概念的例子。

那里的任何人都愿意帮我或指点我可能错过的一步一步指南?

3 个答案:

答案 0 :(得分:2)

在WPF中使用ObservableCollection<T>进行数据绑定。哪个T是你的班级。见下面的例子

public class NameList : ObservableCollection<PersonName>
{
    public NameList() : base()
    {
        Add(new PersonName("A", "E"));
        Add(new PersonName("B", "F"));
        Add(new PersonName("C", "G"));
        Add(new PersonName("D", "H"));
    }
  }

  public class PersonName
  {
      private string firstName;
      private string lastName;

      public PersonName(string first, string last)
      {
          this.firstName = first;
          this.lastName = last;
      }

      public string FirstName
      {
          get { return firstName; }
          set { firstName = value; }
      }

      public string LastName
      {
          get { return lastName; }
          set { lastName = value; }
      }
  }

现在在XAML中。转到资源标记

<Window
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

  xmlns:c="clr-namespace:SDKSample"

  x:Class="Sample.Window1"
  Width="400"
  Height="280"
  Title="MultiBinding Sample">

  <Window.Resources>
    <c:NameList x:Key="NameListData"/>
  </Window.Resources>


<ListBox Width="200"
         ItemsSource="{Binding Source={StaticResource NameListData}}"  // Name list data is declared in resource
         ItemTemplate="{StaticResource NameItemTemplate}"
         IsSynchronizedWithCurrentItem="True"/>

xmnls:c会为您提供选择课程的选项。在这里你可以选择c,d,e x,但要确保它应该在之前使用

答案 1 :(得分:1)

说到数据绑定,我发现this page如果仔细阅读,可以解答初学者对它的大部分问题。

回答这个问题:添加所有项目的alernative是告诉ComboBox从哪里获取其项目,这是通过ItemsSource属性完成的。

您可以在XAML或代码中设置它,而在XAML中需要一个绑定表达式,正常的赋值应该在代码中执行:

comboBox.ItemsSource = thingList;

如果您没有进一步指定列表中这些对象的显示方式,则会调用ToString方法,除非被覆盖,否则通常会得到对象的类路径。告诉应用程序如何显示对象有两种主要方式:

第一个更重的选项是Data Templates,它用于使用控件显示复杂数据(反过来可以包含项目和模板等),第二种方法是使用轻量属性,如DisplayMemberPath,应该设置应该显示的属性的名称(通常只是一个字符串)。

如果您的列表发生更改且组合框应自行更新,则源代码应实现INotifyCollectionChanged,在大多数情况下,您将使用标准实现ObersableCollection<T>

答案 2 :(得分:0)

大多数人会使用WPF数据绑定来填充组合框,但您不必这样做。

如果您愿意,可以通过代码添加项目。

很容易被困在做所有事情,因为它“应该”完成而没有充分的理由这样做(顺便说一句,我不建议你手动添加项目,我只是说你可以)

List<Thing> thingList = Source.getList();

foreach(Thing t in thingList)
{
   combobox.Items.Add( t );
}