Что я должен изменить в своей привязке данных WPF, чтобы Listbox отображал элементы? - PullRequest
1 голос
/ 27 апреля 2009

Я нашел этот XAML в примере:

<Window x:Class="TestDataTemplate123.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:TestDataTemplate123"
    Title="Window1" Height="300" Width="300">
    <Window.Resources>
        <local:Customer x:Key="customers"/>
    </Window.Resources>
    <StackPanel>
        <TextBlock Text="Customers:"/>
        <ListBox ItemsSource="{Binding Source={StaticResource customers}}"/>
    </StackPanel>
</Window>

Я пытаюсь создать код позади, но следующее не работает (отображается пустой набор (я ожидаю список слов, которые говорят TestDataTemplate123.Customer).

Window1.cs

using System.Collections.ObjectModel;
using System.Windows;

namespace TestDataTemplate123
{
    public partial class Window1 : Window
    {
        public static ObservableCollection<Customer> Customers()
        {
            return Customer.GetAllCustomers();
        }

        public Window1()
        {
            InitializeComponent();
        }
    }
}

Customer.cs:

using System.Collections.ObjectModel;

namespace TestDataTemplate123
{
    public class Customer
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public int Age { get; set; }

        public static ObservableCollection<Customer> GetAllCustomers()
        {
            ObservableCollection<Customer> customers = new ObservableCollection<Customer>();
            customers.Add(new Customer() {FirstName = "Jim", LastName = "Smith", Age = 23});
            customers.Add(new Customer() {FirstName = "John", LastName = "Jones", Age = 22});
            customers.Add(new Customer() {FirstName = "Jay", LastName = "Anders", Age = 21});
            return customers;
        }
    }
}

Я пробовал много разных комбинаций xmlns: local, x: Key, StaticResource, DataContext, но я получаю различные ошибки или пустой ListBox.

Что мне нужно изменить, чтобы я просто перечислил TestDataTemplate123.Customer, чтобы я мог продолжать создавать свой DataTemplate?

Ответы [ 2 ]

3 голосов
/ 27 апреля 2009

Вам необходимо создать деривацию DataSourceProvider ObjectDataprovider , которая возвращает список отображаемых объектов

<Window.Resources>
  <ObjectDataProvider x:Key="Customers" 
       ObjectType="{x:Type local:Customer}" 
       MethodName="GetAllCustomers" />
</Window.Resources>
...
<ListBox DataContext="{StaticResouce Customers}" ItemsSource="{Binding}" ... />
3 голосов
/ 27 апреля 2009

В вашем XAML вы связываете элементы в своем списке с одним экземпляром Customer. Вам необходимо привязать список клиентов.

Поскольку большую часть работы вы выполняете в коде, я исключаю объявление <local:Customer /> в XAML, а также атрибут ItemsSource и задаю его в вашем коде:

public Window1()
{
    InitializeComponent();
    listBox1.ItemsSource = Customer.GetAllCustomers();
}

Обратите внимание, что я дал ListBox имя, чтобы я мог ссылаться на него из кода ниже. Сделайте это так:

<ListBox x:Name="listBox1" />
...