WPF Datagrid связывающий для списка проблемы

У меня есть список пользовательских объектов: скажите Фрукты с двумя Именами свойств строки и Цветом. Они находятся в Списке.

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>

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

У меня нет удачи при получении этих объектов в datagrid... и вниз дорожке, я хочу, чтобы щелчок по объекту в datagridcell изменился на поле комбинированного списка и показал все возможные типы Фруктовых Имен и Цветов (таким образом, они могут изменить отношения),

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

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')

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

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

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

Править: что я имею теперь:

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 на ложь и затем указываю мои столбцы в xaml как, я хочу для использования звездообразной калибровки, я получаю правильное число столбцов, но никакого текста!

5
задан baron 25 January 2010 в 04:16
поделиться

2 ответа

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

dgFruit.ItemsSource = "{Binding}"

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

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

, а затем в конструкторе Visual:

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

Теперь контекст данных для всего визуализации - это список , а элементы к вашим сетке устанавливаются, чтобы быть одинаковым объектом. Здесь я предполагаю, что 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*" />

, где Allocolors определяется как ресурс (в данном случае):

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

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

4
ответ дан 14 December 2019 в 04:38
поделиться

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

.
4
ответ дан 14 December 2019 в 04:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: