似乎无法在我的脑海中获得WPF DataBinding
好的,我不是编程或C#的新手,因为我似乎无法让WPF的数据绑定直线前进。我的同事对此表示赞赏(是的,我也会问他们),但现在我很难过。似乎无法在我的脑海中获得WPF DataBinding
这是我想对于初学者做什么:
例如,我已经得到的东西像这样的列表:
List<Thing> thingList = Source.getList();
现在通常我会去
foreach(Thing t in thingList)
{
//add thing to combobox
}
但从我能收集的是,我可以某种程度上不这样做,但使用数据绑定来填充c ombobox对我来说。
我似乎无法得到的是其中我会把'thingList'?我是否在某处将它作为单独的财产?我在哪里放置该物业?
我现在觉得很愚蠢,因为我一直在为此苦苦挣扎了一段时间,我找不到任何可以让我明白这一点的例子 - 可能很简单 - 概念。
任何人都愿意帮助我或指点我一些分步指南我可能错过了?
在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,但是要确保它应该早些使用
当收集预计会发生变化时,您只需要使用'ObservableCollection'。如果集合是静态的,那么实现'IEnumerable'的任何东西都可以。 – 2011-03-21 19:57:05
是的,我知道,它会用于你需要双向绑定时,否则只是数据源和数据值成员等工作 – 2011-03-21 19:59:26
这主要是我在找什么,是的。我知道这是一个非常广泛的主题,但是你所描述的主要是我正在考虑的'自动'过程。谢谢。 – 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);
}
这可能是实现这个目标的最糟糕的方式,并且有很多好的理由不这样做。至少你应该更新你的例子来将集合分配给ItemsSource,而不是单独添加每个项目。 – 2011-03-21 23:26:35
我以为我明确表示我并不推荐这种填充列表的方式。我只是回应声明“但从我能收集的是,我可以以某种方式不这样做”。 – grantnz 2011-03-22 00:33:06
如果它像的WinForms数据绑定任何东西,你的组合框应该有一个'DataSource'属性(或类似的东西),你应该能够设置'comboBox.DataSource = Source.getList();'作为只要设置了“DisplayMember”和“ValueMembers”,就会显示正确的内容,而SelectedValue将检索对象本身。 – Crisfole 2011-03-21 19:52:09
这里有几个SO问题会让你开始正确的方向:[绑定WPF组合框到自定义列表](http://stackoverflow.com/questions/561166/binding-wpf-combobox-toa-a-自定义列表)和[MVVM:教程从开始到结束](http://stackoverflow.com/questions/1405739/mvvm-tutorial-from-start-to-finish) – 2011-03-21 19:53:16
在WPF中,使用ComboBoxes和ListViews之类的东西作为数据的可视容器。在代码后面或文件等中构建和编辑您的列表,并绑定到表单上的控件。 – coldandtired 2011-03-21 20:38:14