Почему связывание с использованием ItemsSource работает в коде, а не в xaml? - PullRequest
0 голосов
/ 06 апреля 2020

Я пытаюсь связать комбинированный список с DataTemplate со списком классов, сгенерированных функцией stati c. Когда привязка выполняется на уровне кода combo1.ItemsSource = Peoplelist;, она работает, но когда такая же привязка выполняется в xaml ItemsSource="{Binding Path=Peoplelist}", это не так. Почему?

MainWindow.xaml.cs

using System;
using System.Collections.Generic;
using System.Windows;

namespace WpfTest
{
    public partial class MainWindow : Window
    {
        public List<People> Peoplelist;

        public MainWindow()
        {
            Peoplelist = new List<People>();
            People.Populate(Peoplelist);

            InitializeComponent();
            //combo1.ItemsSource = Peoplelist;  //working
        }
    }


    public class People
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }

        public People() { }

        public People(String _FirstName, String _FamilyName)
        {
            FirstName = _FirstName;
            LastName = _FamilyName;
        }

        public static void Populate(List<People> lst)
        {
            lst.Add(new People
            {
                FirstName = "Jon",
                LastName = "Jonathan",
            });
            lst.Add(new People
            {
                FirstName = "Mark",
                LastName = "Markthan",
            });
            lst.Add(new People
            {
                FirstName = "Spence",
                LastName = "Spencer",
            });
        }
    }
}

MainWindow.xaml

<Window x:Class="WpfTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
           mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <ComboBox Name="combo1" VerticalAlignment="Center" HorizontalAlignment="Center" MinWidth="200" 
          SelectedValuePath="LastName" ItemsSource="{Binding Path=Peoplelist}">
            <ComboBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <TextBlock Text="{Binding FirstName}"/>
                        <TextBlock Text="--"/>
                        <TextBlock Text="{Binding LastName}"/>
                    </StackPanel>
                </DataTemplate>
            </ComboBox.ItemTemplate>
        </ComboBox>
    </Grid>
</Window>

1 Ответ

1 голос
/ 06 апреля 2020

Есть две вещи не так с вашим кодом. Первое: вы не указали контекст данных в своем xaml или коде, поэтому он не знает, где находятся данные, с которыми вы хотите связать. Второе: ваш список людей должен быть свойством, потому что привязка данных WPF работает только со свойствами publi c.

Поэтому ваш класс MainWindow должен быть

public partial class MainWindow : Window
{
    public List<People> Peoplelist { get; set; }

    public MainWindow()
    {
        Peoplelist = new List<People>();
        People.Populate(Peoplelist);
        DataContext = this;
        InitializeComponent();
    }
}
...