将集合绑定到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>

将集合绑定到WPF ListBox

您需要更改

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的ItemsSourceItemsSource="{Binding}"。您已经将ListBox的DataContext设置为客户列表,您需要将ItemsSource设置为相同的集合,因此,直接绑定。

如果您更喜欢使用CollectionViewSource,您可以做的另一件事是将窗口的DataContext设置为同一类DataContext=this,因为如果没有这一点,资源定义将无法定位您在代码后面定义的"Customers"集合。但是,如果您这样做,就不需要CustomerList.DataContext = Customers;,因为您直接将ItemsSource分配给静态资源,而不是相对于DataContext。

还有一件事。我认为您应该在代码中为CollectionViewSource和相应的集合提供不同的名称。这不会导致运行时问题,但会使代码难以维护;(

希望这有帮助:(