DisplayMemberPath在WPF中不起作用

时间:2012-10-21 04:23:57

标签: wpf listbox

我想仅使用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>

3 个答案:

答案 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 - 要显示的实际属性(在我的例子中,它是名称)。