将集合绑定到WPF ListBox
本文关键字:WPF ListBox 绑定 集合 | 更新日期: 2023-09-27 18:02:22
更新:到目前为止,我已经根据您的帮助更新了代码,但仍然没有成功。当应用程序加载时,ListBox没有任何项。我在windows的构造器中为客户分配垃圾值,然后还试图设置ListBox的DataContext,如下所示:
CustomerList.DataContext = Customers;
---原始问题(带更新代码(---
我在WPF项目中遇到了数据绑定问题。
我有一个类,客户,如下所示:
public class Customer
{
public String Name { get; set; }
public String Email { get; set; }
}
在我的XAML代码中,我有一组客户,如下所示:
public List<Customer> Customers { get; set; }
我试图用ListItemTemplate将每个客户绑定到ListBox,该ListItemTemplate在TextBoxes中显示客户的信息(姓名/电子邮件(,以及一个锁定/卸载TextBoxes的按钮(将IsEnabled属性设置为true或false(。
对此最好的方法是什么?
到目前为止,我一直在尝试追随他,但没有成功。
在XAML中,我目前有以下内容(暂时忽略切换部分,我只是想让集合本身列出。(:
<Window.Resources>
<CollectionViewSource x:Key="Customers" Source="{Binding Path=Customers, Mode=TwoWay}"/>
<DataTemplate x:Key="Customer">
<StackPanel Orientation="Horizontal">
<TextBox Content="{Binding Name}" />
<TextBox Content="{Binding Email}" />
</StackPanel>
</DataTemplate>
</Window.Resources>
<StackPanel>
<ListBox ItemsSource="{Binding Source={StaticResource Customers}}"
ItemTemplate="{StaticResource ResourceKey=Customer}"
Name="CustomerList"
Height="300" />
</StackPanel>
您需要更改
ItemsSource="{Binding Source=Customers}"
至
ItemsSource="{Binding Source={StaticResource Customers}}" DataContext="{StaticResource Customers}"
更改后,类似于更新代码的代码对我有效
<TextBox Content="{Binding Name}" />
至
<TextBox Text="{Binding Name}" />
由于TextBox
没有Content
属性(就像Label
一样(,前者拒绝在VS中编译。
好吧,在定义中它被设置为Text
:
[ContentPropertyAttribute("Text")]
public class TextBox : TextBoxBase, IAddChild
但我认为它只用于括号之间(<TextBox>Like so</TextBox>
(?
这可能是问题的根源吗?
尝试按如下方式设置CustomerList的ItemsSource
:ItemsSource="{Binding}"
。您已经将ListBox的DataContext
设置为客户列表,您需要将ItemsSource设置为相同的集合,因此,直接绑定。
如果您更喜欢使用CollectionViewSource
,您可以做的另一件事是将窗口的DataContext设置为同一类DataContext=this
,因为如果没有这一点,资源定义将无法定位您在代码后面定义的"Customers"集合。但是,如果您这样做,就不需要CustomerList.DataContext = Customers;
,因为您直接将ItemsSource分配给静态资源,而不是相对于DataContext。
还有一件事。我认为您应该在代码中为CollectionViewSource和相应的集合提供不同的名称。这不会导致运行时问题,但会使代码难以维护;(
希望这有帮助:(