更新:到目前为止,我已根据您的帮助更新了代码,但仍然没有运气。当应用程序加载ListBox时没有项目。我在windows的构造函数中为客户分配垃圾值,然后我也尝试按如下方式设置ListBox的DataContext:
CustomerList.DataContext = Customers;
--- 原始问题(更新后的代码)---
我在WPF项目中遇到数据绑定问题。
我有一个类Customer,如下:
public class Customer
{
public String Name { get; set; }
public String Email { get; set; }
}
在我的XAML代码背后,我有一组客户如下:
public List<Customer> Customers { get; set; }
我正在尝试将每个客户绑定到一个ListBox,其中ListItemTemplate显示TextBoxes中的客户信息(名称/电子邮件)以及一个锁定/取消组合TextBoxes的按钮(将IsEnabled属性设置为true或false)。 / p>
最好的方法是什么?
到目前为止,我一直在努力追随他并没有成功。
在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>
答案 0 :(得分:1)
类似于更新后的代码在更改
后适合我<TextBox Content="{Binding Name}" />
到
<TextBox Text="{Binding Name}" />
由于TextBox
没有Content
属性(如Label
),前者拒绝在VS中编译。
好吧,它在定义中设置为Text
:
[ContentPropertyAttribute("Text")]
public class TextBox : TextBoxBase, IAddChild
但我认为只在括号(<TextBox>Like so</TextBox>
)之间使用?
这可能是问题的根源吗?
答案 1 :(得分:0)
您需要更改
ItemsSource="{Binding Source=Customers}"
到
ItemsSource="{Binding Source={StaticResource Customers}}" DataContext="{StaticResource Customers}"
答案 2 :(得分:0)
尝试按以下方式设置CustomerList的ItemsSource
:ItemsSource="{Binding}"
。您已将ListBox的DataContext
设置为客户列表,您需要将ItemsSource设置为相同的集合,因此,直接绑定。
如果您更喜欢使用CollectionViewSource
,您可以做的另一件事是将窗口的DataContext设置为同一个类DataContext=this
,因为没有这个,资源定义就赢了'能够找到您在后面的代码中定义的“客户”集合。但是,如果这样做,则不需要CustomerList.DataContext = Customers;
,因为您直接将ItemsSource分配给静态资源,而不是相对于DataContext。
还有一件事。我认为你应该给代码中的CollectionViewSource和相应的集合提供不同的名称。这不会导致运行时问题,但这使得维护代码变得困难;)
希望这会有所帮助:)