У меня есть список пользовательских объектов: скажите Фрукты с двумя Именами свойств строки и Цветом. Они находятся в Списке.
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 как, я хочу для использования звездообразной калибровки, я получаю правильное число столбцов, но никакого текста!
Во-первых, это:
dgFruit.ItemsSource = "{Binding}"
должен установить Источники элементов в строку, содержащую слово привязку в брекетах. Это почти наверняка не то, что вы хотите (на самом деле, если вы это сделаете, вы должны в конечном итоге с помощью сетки с девятью строками, один для каждого персонажа в строке!). Вы можете установить элементыSource в XAML или код позади, но вы не должны делать обоих. Попробуйте следующее:
<toolkit:DataGrid Name="dgFruit"
ItemsSource="{Binding}">
...
</toolkit:DataGrid>
, а затем в конструкторе Visual:
...
InitializeComponents();
this.DataContext = 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>
Это должно вас начать.
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