2

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>
4

3 に答える 3

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をコピーする個別のリストを用意する必要はありません。これは、データを不必要に複製していることを意味し、データが各コレクションと同期しなくなる可能性もあります。NameLastNameCustomer

また、コレクションまたはデータを変更できる場合は、INotifyPropertyChanged の使用を検討し、クラスで INotifyCollectionChanged を使用する (例:ObservableCollectionの代わりに使用し、クラスListに実装する) 必要があります。INotifyPropertyChangedCustomer

例えば

public class CustomerList
{
    public ObservableCollection<Customer> Customers { get; set; }
    public CustomerList()
    {
        Customers = new ObservableCollection<Customer>();
        Customers.Add(new Customer { Name = "Name1", LastName = "LastName1" });
        Customers.Add(new Customer { Name = "Name2", LastName = "LastName2" });
    }
}

<ListBox ItemsSource="{Binding Source={StaticResource Cust}, Path=Customers}" DisplayMemberPath="Name" Height="172" HorizontalAlignment="Left" Margin="27,23,0,0" Name="lstStates" VerticalAlignment="Top" Width="245" />
于 2012-10-21T04:49:31.167 に答える
2

ここにはいくつかのことがあります。まず、ソースがオブジェクトに設定されますが、実際のリストはCustomersオブジェクトのプロパティです。したがって、使用する必要がありますSource={StaticResource Cust},Path=Customers}。次に、DisplayMemberPathはアイテムのプロパティである必要があります。この場合は、「CustomerName」の代わりにNameCustomerを使用する必要があります。これは機能します:

<ListBox 
    ItemsSource="{Binding Source={StaticResource Cust},Path=Customers}"  
    DisplayMemberPath="Name" />
于 2012-10-21T04:48:18.990 に答える
0

この議論からの私の最後の見解:ItemControlをバインドするには、3つのプロパティを処理する必要があります。1。ソース-コレクションプロパティ(私の場合はCust)を含むのはx:Key[クラス名]になります。2.パス-コレクションを含むプロパティ(私の場合はCustomers)3. DisplayMemberPath-表示される実際のプロパティ(私の場合はName)。

于 2013-03-06T16:31:26.133 に答える