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

问题描述:

好的,我不是编程或C#的新手,因为我似乎无法让WPF的数据绑定直线前进。我的同事对此表示赞赏(是的,我也会问他们),但现在我很难过。似乎无法在我的脑海中获得WPF DataBinding

这是我想对于初学者做什么:

例如,我已经得到的东西像这样的列表:

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

现在通常我会去

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

但从我能收集的是,我可以某种程度上不这样做,但使用数据绑定来填充c ombobox对我来说。

我似乎无法得到的是其中我会把'thingList'?我是否在某处将它作为单独的财产?我在哪里放置该物业?

我现在觉得很愚蠢,因为我一直在为此苦苦挣扎了一段时间,我找不到任何可以让我明白这一点的例子 - 可能很简单 - 概念。

任何人都愿意帮助我或指点我一些分步指南我可能错过了?

+0

如果它像的WinForms数据绑定任何东西,你的组合框应该有一个'DataSource'属性(或类似的东西),你应该能够设置'comboBox.DataSource = Source.getList();'作为只要设置了“DisplayMember”和“ValueMembers”,就会显示正确的内容,而SelectedValue将检索对象本身。 – Crisfole 2011-03-21 19:52:09

+0

这里有几个SO问题会让你开始正确的方向:[绑定WPF组合框到自定义列表](http://*.com/questions/561166/binding-wpf-combobox-toa-a-自定义列表)和[MVVM:教程从开始到结束](http://*.com/questions/1405739/mvvm-tutorial-from-start-to-finish) – 2011-03-21 19:53:16

+0

在WPF中,使用ComboBoxes和ListViews之类的东西作为数据的可视容器。在代码后面或文件等中构建和编辑您的列表,并绑定到表单上的控件。 – coldandtired 2011-03-21 20:38:14

在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

当收集预计会发生变化时,您只需要使用'ObservableCollection'。如果集合是静态的,那么实现'IEnumerable'的任何东西都可以。 – 2011-03-21 19:57:05

+0

是的,我知道,它会用于你需要双向绑定时,否则只是数据源和数据值成员等工作 – 2011-03-21 19:59:26

+0

这主要是我在找什么,是的。我知道这是一个非常广泛的主题,但是你所描述的主要是我正在考虑的'自动'过程。谢谢。 – 2011-03-23 11:56:13

当涉及到数据绑定时,我发现this page如果仔细阅读,大多数初学者都会回答这个问题。

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

您可以设置这在XAML或代码,而你需要在XAML绑定表达式正常的分配应该做的代码:

comboBox.ItemsSource = thingList; 

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

拳头和更重的选项是Data Templates它用于显示复杂的数据使用控件(反过来可以有项目和模板等),第二个方式是使用像DisplayMemberPath这样的轻量级属性,它应该被设置为应该显示的属性的名称(通常只是一个字符串)。

如果您的列表的变化和组合框应自行更新源应实现INotifyCollectionChanged,在大多数情况下,你会使用标准的实施ObersableCollection<T>

大多数人会使用WPF Databinding来填充组合框,但是你不需要。

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

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

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

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

这可能是实现这个目标的最糟糕的方式,并且有很多好的理由不这样做。至少你应该更新你的例子来将集合分配给ItemsSource,而不是单独添加每个项目。 – 2011-03-21 23:26:35

+0

我以为我明确表示我并不推荐这种填充列表的方式。我只是回应声明“但从我能收集的是,我可以以某种方式不这样做”。 – grantnz 2011-03-22 00:33:06