WPF привязка данных к универсальному списку <> - PullRequest
2 голосов
/ 16 февраля 2010

Я делаю что-то не так ... Вы знаете, как это.

Я попытался поиграться с ItemsSource, DataContext, DisplayMemberPath и SelectedValuePath, и я либо получил пустой список списка метода ToString, вызываемого в объекте Person;

ЧТО ДЕЙСТВИТЕЛЬНО ПОМОГАЕТ кому-то опубликовать ответ, который подходит для этого примера.

Я упростил эту проблему, так как в целом у меня возникают трудности с дженериками привязки данных.

Я создал простой общий список лиц и хочу связать его с комбо. (также хочу попробовать использовать ListView тоже.)

Я либо получаю список пробелов, либо список 'xxxx.Person', где xxxx = пространство имен

       <Window x:Class="BindingGenerics.MainWindow"
                xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                Title="MainWindow" Height="300" Width="300">
            <Grid>

                <ComboBox Name="ComboBox1"
                          ItemsSource="{Binding}"
                          Height="50"
                          DisplayMemberPath="Name"
                          SelectedValuePath="ID"
                          FontSize="14"
                          VerticalAlignment="Top">
                </ComboBox>

            </Grid>
        </Window>



using System.Windows;
using System.ComponentModel;

namespace BindingGenerics
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            Person p = new Person();
            // I have tried List and BindingList
            //List<Person> list = new List<Person>();
            BindingList<Person> list = new BindingList<Person>();

            p.Name = "aaaa";
            p.ID = "1111";
            list.Add(p);

            p = new Person();
            p.Name = "bbbb";
            p.ID = "2222";
            list.Add(p);

            p = new Person();
            p.Name = "cccc";
            p.ID = "3333";
            list.Add(p);

            p = new Person();
            p.Name = "dddd";
            p.ID = "4444";
            list.Add(p);

            ComboBox1.DataContext = list;
        }
    }

    public struct Person
    {
        public string Name;
        public string ID;
    }
}

Ответы [ 3 ]

5 голосов
/ 16 февраля 2010

В вашем примере кода Person.Name - это поле, а не свойство. Привязка данных WPF учитывает только свойства, а не поля, поэтому необходимо изменить Person.Name на свойство.

Измените декларацию Person на:

public class Person
{
  public string Name { get; set; }
  public string ID { get; set; }
}

(Для производственного кода вы, вероятно, захотите использовать ObservableCollection<Person> вместо List<Person> и либо сделать Person неизменяемым, либо заставить его реализовать INotifyPropertyChanged - но это не источники вашей непосредственной проблемы.)

0 голосов
/ 16 февраля 2010

Хорошо ... Я предполагаю, что ваш реальный код исправил синтаксис, поскольку код, который вы вставили, не будет компилироваться.

Я поместил этот код в новое приложение WPF, и после добавления каждого объекта Person мой комбинированный список заполнялся нормально. Возможно, вы захотите переместить свой код заполнителя в событие Loaded, которое обеспечит правильную конструкцию формы. Вот исправленные xaml и codebehind (с несколькими ярлыками синтаксиса):

XAML:

<Grid>
    <ComboBox Name="ComboBox1" Height="70"  
        DisplayMemberPath="Name"    
        SelectedValuePath="ID" />
</Grid>

отделенный код:

    public Window1()
    {
        InitializeComponent();
        this.Loaded += new RoutedEventHandler(Window1_Loaded);
    }

    void Window1_Loaded(object sender, RoutedEventArgs e)
    {
        var list = new List<Person>();
        Person p = new Person(){Name = "aaaa",ID = "1111"};
        list.Add(p);
        p = new Person(){Name = "bbbb", ID="2222"};
        list.Add(p);
        p = new Person(){Name = "cccc", ID="3333"};
        list.Add(p);
        p = new Person(){Name = "dddd", ID="4444"};
        list.Add(p);
        ComboBox1.ItemsSource = list;
    }
0 голосов
/ 16 февраля 2010

В показанном коде вы дважды устанавливаете ItemsSource, в первый раз в XAML (вызываемом InitializeComponent) значение DataContext ComboBox1, которое нельзя определить по тому, что вы опубликовали, но, вероятно, это не то, что вам нужно. После этого вы сбрасываете его из кода в свой объект списка (здесь с опечатками). В этом коде вы также добавляете один и тот же экземпляр Person 4 раза и просто меняете его имя и идентификатор снова и снова. Я подозреваю, что комбинация этих проблем и тот факт, что вы используете List вместо ObservableCollection, вызывают проблемы в вашем приложении.

Было бы полезно сузить его, если бы вы могли опубликовать какой-то реальный код, с которым у вас возникают проблемы, поскольку то, что вы здесь разместили, даже не компилируется.

...