WPF Datagrid привязка к списку проблем - PullRequest
5 голосов
/ 25 января 2010

У меня есть список пользовательских объектов: скажем, Fruits с двумя строковыми свойствами Name и Color. Они в списке.

private readonly List<Fruit> fruitList = new List<Fruit>();

Затем я загружаю фруктовые объекты в список.

Я пытаюсь связать этот список с WPF Datagrid:

C #:

dgFruit.ItemsSource = "{Binding}";

XAML:

<toolkit:DataGrid Name="dgFruit" 
            ItemsSource="{Binding Path=fruitList}" >
                <toolkit:DataGrid.Columns>

                    <toolkit:DataGridComboBoxColumn 
            Header="Name" 
            SelectedValueBinding="{Binding Path=Name}" 
            TextBinding="{Binding Path=Name}" Width="5*" />   

                    <toolkit:DataGridComboBoxColumn 
            Header="Color"
            SelectedValueBinding="{Binding Path=Color}"
            TextBinding="{Binding Path=Color}" Width="5*" />

                </toolkit:DataGrid.Columns>
            </toolkit:DataGrid>

Причина, по которой они находятся в выпадающем списке, заключается в том, что я хочу, чтобы пользователь мог изменять отношения. Это не настоящий пример, но вы поняли идею. Скажем для примера, что фрукты не созрели, поэтому они меняют цвет банана на зеленый:)

Мне не повезло, что я получил эти элементы в таблице данных ... и в дальнейшем я хочу щелкнуть элемент в ячейке данных, чтобы перейти в комбинированный список и показать все возможные типы названий и цветов фруктов (так что они могут изменить отношения)

Вот ошибка, которую я получаю:

System.Windows.Data Error: 39 : BindingExpression path error: 'Color' property not found on 'object' ''Char' (HashCode=6750311)'. BindingExpression:Path=Color; DataItem='Char' (HashCode=6750311); target element is 'TextBlockComboBox' (Name=''); target property is 'Text' (type 'String')

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

Я вижу, что большинство примеров используют ObservableCollection, но если я могу выполнить привязку к списку, почему я должен использовать это?

Пожалуйста, позвольте мне знать, если мой пример требует дальнейших разъяснений

Редактировать: что у меня сейчас:

XAML:

            <toolkit:DataGrid Name="dgFruit" 
            ItemsSource="{Binding}"
            AutoGenerateColumns="False">

                <toolkit:DataGrid.Columns>
                    <toolkit:DataGridTextColumn 
                        Header="Name"
                        Width="5*"/>

                    <toolkit:DataGridComboBoxColumn 
            Header="Color"
            Width="5*"/>

                    </toolkit:DataGrid.Columns>
</toolkit:DataGrid>

C #:

DataContext = fruitList;

На самом деле, когда я использую DataContext, я ничего не получаю. Когда я использую ItemSource, я получаю пустые строки, но правильное количество строк, так что это выглядит больше вдоль правильных строк.

Я могу получить данные, которые будут показаны, если разрешу автоматическое создание столбцов. Если я установлю для autogeneratecolumns значение false, а затем укажу мои столбцы в xaml, как я хочу использовать размер звездочки, я получу правильное количество столбцов, но без текста!

Ответы [ 2 ]

4 голосов
/ 25 января 2010

Во-первых, это:

dgFruit.ItemsSource = "{Binding}"

должен установить источник элементов в строку, содержащую слово Binding в фигурных скобках. Это почти наверняка не то, что вы хотите (на самом деле, если вы сделаете это, вы должны получить сетку из девяти строк, по одной на каждый символ в строке!) Вы можете установить ItemsSource в XAML или в коде, но вы не должны делать и то, и другое. Попробуйте следующее:

<toolkit:DataGrid Name="dgFruit"       
                  ItemsSource="{Binding}">
    ...
</toolkit:DataGrid>

А затем в конструкторе вашего визуала:

...
    InitializeComponents();
    this.DataContext = fruitList;
...

Теперь контекстом данных для всего визуального объекта является List , а для ItemsSource вашей сетки задан один и тот же объект. Здесь я предполагаю, что fruitList - это само поле визуала.

Привязки для ваших столбцов должны выглядеть примерно так:

        <toolkit:DataGridTextColumn Header="Name"
                                    Binding="{Binding Name}"
                                    Width="5*" />
        <toolkit:DataGridComboBoxColumn Header="Color"
                                        ItemsSource="{Binding Source={StaticResource AllColors}}"
                                        SelectedValueBinding="{Binding Path=Color}"
                                        TextBinding="{Binding Path=Color}"
                                        Width="5*" />

Где AllColors определяется как ресурс (в данном случае):

<x:Array x:Key="AllColors"
         Type="sys:String">
    <sys:String>Orange</sys:String>
    <sys:String>Yellow</sys:String>
</x:Array>

Это должно помочь вам начать.

4 голосов
/ 25 января 2010

WPF не поддерживает привязку к полям.Создайте свойство, которое обращается к fruitList и привязывается к нему.

    // this is the field. you can't bind to this
    private readonly List<Fruit> fruitList = new List<Fruit>();

    // this is the property. you can bind to this
    public List<Fruit> FruitList
    {
        get { return fruitList; }
    }

Используйте dgFruit.DataContext = this; вместо dgFruit.ItemsSource = "{Binding}";

И если вы хотите показать их в ComboBox, вам нужно связать эти DataGridComboBoxColumn со списком цветов, а нестрока.Например, ваш класс может выглядеть как

public class Fruit
{
    public string Name { get; set; }
    public string Color { get; set; } // bind the combobox selectedvalue to this

    public List<string> AvailableColors { get; set; } // bind the combobox ItemsSource to this
}

И вы можете использовать List, если хотите.Преимущество ObservableCollection в том, что он уже реализует INotifyCollectionChanged и INotifyPropertyChanged для вас

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...