我想仅使用CustomerList\CustomerName
ListBox
属性向ItemsSource
显示DisplayMemberPath
属性项。但它没有用。我不想在我的问题中使用DataContext
或任何其他绑定。请帮忙。
我的代码如下:
MainWindow.xaml.cs
namespace BindingAnItemControlToAList
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
}
public class Customer
{
public string Name {get;set;}
public string LastName { get; set; }
}
public class CustomerList
{
public List<Customer> Customers { get; set; }
public List<string> CustomerName { get; set; }
public List<string> CustomerLastName { get; set; }
public CustomerList()
{
Customers = new List<Customer>();
CustomerName = new List<string>();
CustomerLastName = new List<string>();
CustomerName.Add("Name1");
CustomerLastName.Add("LastName1");
CustomerName.Add("Name2");
CustomerLastName.Add("LastName2");
Customers.Add(new Customer() { Name = CustomerName[0], LastName = CustomerLastName[0] });
Customers.Add(new Customer() { Name = CustomerName[1], LastName = CustomerLastName[1] });
}
}
}
**MainWindow.Xaml**
<Window x:Class="BindingAnItemControlToAList.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:BindingAnItemControlToAList"
Title="MainWindow" Height="350" Width="525" Loaded="Window_Loaded" >
<Window.Resources>
<local:CustomerList x:Key="Cust"/>
</Window.Resources>
<Grid Name="Grid1">
<ListBox ItemsSource="{Binding Source={StaticResource Cust}}" DisplayMemberPath="CustomerName" Height="172" HorizontalAlignment="Left" Margin="27,23,0,0" Name="lstStates" VerticalAlignment="Top" Width="245" />
</Grid>
</Window>
答案 0 :(得分:4)
您没有将“集合”设置为ItemsSource ...因此您无法选择任何内容。这将选择列表CustomerName
。
<ListBox ItemsSource="{Binding Source={StaticResource Cust}, Path=CustomerName}" Height="172" HorizontalAlignment="Left" Margin="27,23,0,0" Name="lstStates" VerticalAlignment="Top" Width="245" />
但实际上,您应该重新构建CustomerList
课程...不需要有单独的列表来复制Name
的{{1}}和LastName
字段 - 它表示您不必要地复制数据,并且数据可能与每个集合不同步。
您还应该考虑使用INotifyPropertyChanged,并在您的类上使用INotifyCollectionChanged(例如,使用Customer
代替ObservableCollection
,并在List
类上实现INotifyPropertyChanged
,如果它是可以更改集合或数据。
e.g。
Customer
答案 1 :(得分:2)
这里有几件事。首先,您的源设置为对象,但实际列表是对象的属性Customers
。所以你需要使用Source={StaticResource Cust},Path=Customers}
。其次,DisplayMemberPath
需要是项目的属性,在本例中为Customer
- 因此您必须使用名称而不是“CustomerName”。这有效:
<ListBox
ItemsSource="{Binding Source={StaticResource Cust},Path=Customers}"
DisplayMemberPath="Name" />
答案 2 :(得分:0)
我最后的讨论:要绑定一个ItemControl,我们需要处理3个属性:1。Source - 它将是x:Key [类名],它将包含collection属性(在我的例子中,Cust )。 2.路径 - 它将是包含集合的属性(在我的情况下,客户)3。DisplayMemberPath - 要显示的实际属性(在我的例子中,它是名称)。