Получение WPF Listview для отображения ObservableCollection <T>с использованием привязки данных - PullRequest
7 голосов
/ 13 января 2011

У меня есть наблюдаемая коллекция типа Project, которую я хочу отобразить в ListView, но в мой ListView ничего не добавляется, чего я действительно не понимаю

My MainWindow.xaml

            <ListView Name="ListViewProjects" Grid.Column="0" Grid.RowSpan="3" SelectionChanged="ListViewProjectsSelectionChanged" ItemsSource="{Binding}" IsSynchronizedWithCurrentItem="True" MinWidth="100">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <WrapPanel>
                        <TextBlock Text="{Binding Path=ProjectID}"/>
                        <TextBlock Text="{Binding Path=ProjectName}"/>
                    </WrapPanel>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>

Мой MainWindow.cs

    public partial class MainWindow : Window
{
    ObservableCollection<Project> Projects = new ObservableCollection<Project>();
    ObservableCollection<Employee> Employees = new ObservableCollection<Employee>();

    public MainWindow()
    {
        InitializeComponent();

        DataContext = Projects;

        Project pro1 = new Project(1, "Swordfish");
        Projects.Add(pro1);
        Employee empMads = new Employee("Mads", 1);
        Employee empBrian = new Employee("Brian", 2);
        Employees.Add(empMads);
        Employees.Add(empBrian);
    }

    private void ListViewProjectsSelectionChanged(object sender, SelectionChangedEventArgs e)
    {
    }
}

и мой Project.cs, который является файлом класса

[Serializable]
class Project : INotifyPropertyChanged
{
    public Project(int id, string name)
    {
        ID = id;
        Name = name;
    }

    private int id;
    public int ID
    {
        get { return id; }
        set
        {
            id = value;
            NotifyPropertyChanged("ProjectID");
        }
    }

    private string name;
    public string Name
    {
        get { return name; }
        set
        {
            name = value;
            NotifyPropertyChanged("ProjectName");
        }
    }

    [field: NonSerialized]
    public event PropertyChangedEventHandler PropertyChanged;

    private void NotifyPropertyChanged(String info)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(info));
        }
    }
}

Но в моем списке ничего не добавлено. Я не вижу, чего мне не хватает для этогона работу.

У меня это как наблюдаемая коллекция. Я делаю DataContext = коллекцию И я делаю привязку в файле xaml

Редактирую кодовую часть 1:

        public ObservableCollection<Project> Projects { get; set; }
    public ObservableCollection<Employee> Employees { get; set; }

    public MainWindow()
    {
        InitializeComponent();
        Projects = new ObservableCollection<Project>();
        Employees = new ObservableCollection<Employee>();

        DataContext = Projects;

Ответы [ 4 ]

3 голосов
/ 13 января 2011

Это потому, что вы используете путь привязки, например ProjectID, в то время как ваш класс Project имеет свойство ID. То же самое касается ProjectName и Name свойств.

E: Если у вас есть проблемы с привязкой, очень полезно просмотреть вкладку Output в режиме отладки Visual Studio, чтобы увидеть, какие ошибки были возвращены из механизма привязки данных. Эти исключения обычно не возвращаются пользователю, но вы можете проверить их там.

2 голосов
/ 13 января 2011

Как уже отмечалось, здесь есть несколько проблем.Одна из «хитростей», которая делает вас новым разработчиком WPF, заключается в том, что вы не можете использовать переменные-члены, вы должны использовать открытые свойства:

public ObservableCollection<Project> Projects { get; set; }
public ObservableCollection<Employee> Employees { get; set; }

Это, конечно, нужно инициализировать вваш конструктор.

Как только вы это сделаете, вам нужно убедиться, что свойства коллекции соответствуют тому, с чем вы связываетесь в ListView.

1 голос
/ 13 января 2011

По умолчанию ваши переменные-члены будут приватными. Если то, что вы разместили здесь, является вашим реальным кодом, то XAML не имеет никакого доступа к нему. Делает эти свойства общедоступными:

public ObservableCollection<Project> Projects = new ObservableCollection<Project>();
public ObservableCollection<Employee> Employees = new ObservableCollection<Employee>();
0 голосов
/ 13 января 2011

1.Ваш список должен быть публичным свойством (Изменить: если вы не установите DataContext, как вы сделали ...) (public ObservableCollection<Project> Projects {get;})

2. Ваше уведомление должно совпадать с фактическим именем свойства:

private int id;
public int ID
{
    get { return id; }
    set
    {
        id = value;
        NotifyPropertyChanged("ID");
    }
}

3. Привязка должна быть такой же:

<TextBlock Text="{Binding Path=ID}"/>

Я думаю ...

...