Не удается получить WPF ListView для привязки к ObservableCollection - PullRequest
6 голосов
/ 03 февраля 2011

Я впервые поигрался с WPF, особенно используя ListView, который я хочу привязать к ObservableCollection, свойству на странице с выделенным кодом.Прямо сейчас я просто пытаюсь понять, как все работает, поэтому я старался не усложнять.К сожалению, я не совсем понимаю, где я ошибаюсь.

Моя страница с выделенным кодом имеет свойство, которое выглядит следующим образом:

public ObservableCollection<Code> Code { get; set; }

У меня есть кнопка наформа, которая запрашивает и заполняет свойство Code.

Класс Code представляет собой простой класс POCO:

public class Code
{
   public string Line { get; set; }
}

Я добавил пространство имен в окно XAML:

<Window x:Class="SampleWPF.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"       
        xmlns:local="clr-namespace:SampleWPF" 
        Title="MainWindow" Height="350" Width="525"                
        >

И ListView выглядит следующим образом:

<DockPanel Height="311" HorizontalAlignment="Left" Name="dockPanel1" 
           VerticalAlignment="Top" Width="182">
    <ListView Name="lstCode"                        
              ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=Window, AncestorLevel=1}, Path=Code}"
              DisplayMemberPath="Line">

        <ListView.View>
            <GridView>
                <GridViewColumn DisplayMemberBinding="{Binding Line}" />
            </GridView>
        </ListView.View>
    </ListView>
</DockPanel>

Я также попытался установить DataContext в коде за конструктором, но безуспешно, напр .: * 10101 *

this.DataContext = this;

РЕДАКТИРОВАТЬ:Перемещая эту строку после строки кода, которая создает фиксированные вещи коллекции (наряду с другими предлагаемыми изменениями).

И я также попытался явно установить ItemsSource в коде (в моем обработчике кликов):

this.lstCode.ItemsSource = this.Code;

Я посмотрел несколько примеров, но мне все еще чего-то не хватает (не удивительно).

1 Ответ

21 голосов
/ 04 февраля 2011

Э-э, вы пытаетесь сделать что-то простое с какой-то ужасной магией;) Ваша привязка должна выглядеть как {Binding Path=Code}.Чтобы сделать это, вы также должны установить DataContext на this, как вы и написали.Это должно дать вам самое простое связывание.Магия с поиском предков здесь не обязательна.

В продвинутых приложениях вам лучше использовать модель Model - View - ViewModel и устанавливать контекст данных для объекта ViewModel, а не для this, но только для тестирования и тестирования WPFэтот подход должен быть в порядке.

Вот пример:

<Window x:Class="binding_test.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
<Grid>
    <ListView ItemsSource="{Binding Path=Code}" />
</Grid>

И код позади:

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

namespace binding_test
{
    public partial class MainWindow : Window
    {
        public ObservableCollection<int> Code { get; set; }
        public MainWindow()
        {
            InitializeComponent();
            Code = new ObservableCollection<int>();
            Code.Add(1);
            this.DataContext = this;
        }
    }
}

А воткак вы должны создать listview для вашего образца.У вас есть специальный класс, и вы, вероятно, не хотите отображать результат ToString() для каждого объекта.Чтобы отобразить элемент любым способом, который вы можете себе представить, вы должны использовать шаблон данных и там создать элементы управления и привязать их к свойствам элемента, который был в списке, который вы привязали ListView.

    <ListView ItemsSource="{Binding Code}">
        <ListView.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Line}" />
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...