C# WPF Datagrid绑定到列表问题
我有一个自定义对象列表:比如带有两个字符串属性Name和Color的水果。这些都在列表中C# WPF Datagrid绑定到列表问题,c#,wpf,visual-studio-2008,list,datagrid,C#,Wpf,Visual Studio 2008,List,Datagrid,我有一个自定义对象列表:比如带有两个字符串属性Name和Color的水果。这些都在列表中 private readonly List<Fruit> fruitList = new List<Fruit>(); XAML: 有人能帮忙吗?我在xaml中设置列的原因是,我可以将宽度设置为星形大小,并使列的宽度相等 我看到大多数示例都使用ObservableCollection,但如果我可以绑定到list,为什么要使用它 如果我的例子需要进一步澄清,请让我知道 编辑:我现在拥
private readonly List<Fruit> fruitList = new List<Fruit>();
XAML:
有人能帮忙吗?我在xaml中设置列的原因是,我可以将宽度设置为星形大小,并使列的宽度相等
我看到大多数示例都使用ObservableCollection,但如果我可以绑定到list,为什么要使用它
如果我的例子需要进一步澄清,请让我知道
编辑:我现在拥有的:
XAML:
实际上,当我使用DataContext时,我没有得到任何项。当我使用ItemSource时,我会得到空行,但行数是正确的,因此这似乎更符合正确的行数
如果我让它自动生成列,我可以得到要显示的数据。如果我将autogeneratecolumns设置为false,然后在xaml中指定我的列,就像我希望使用星形大小一样,我会得到正确的列数,但没有文本 WPF不支持绑定到字段。创建一个访问
水果列表的属性并绑定到该属性
// 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; }
}
如果愿意,您可以使用列表。ObservableCollection
的优点是它已经为您实现了INotifyCollectionChanged
和INotifyPropertyChanged
,首先,这:
dgFruit.ItemsSource = "{Binding}"
应将项源设置为包含大括号中的单词Binding的字符串。这几乎肯定不是您想要的(事实上,如果您这样做,您应该得到一个包含九行的网格,字符串中的每个字符对应一行!)。您可以在XAML中设置ItemsSource,也可以设置隐藏的代码,但不应该同时设置这两个。请尝试以下操作:
<toolkit:DataGrid Name="dgFruit"
ItemsSource="{Binding}">
...
</toolkit:DataGrid>
现在,整个可视化的数据上下文是列表,网格的ItemsSource设置为同一个对象。我在这里假设水果列表本身就是一个视觉领域
列的绑定应类似于:
<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*" />
其中AllColor定义为资源(在本例中):
橙色
黄色的
这应该可以让您开始了。我不明白您创建一个访问水果列表的属性是什么意思。我想我可以使用ObservableCollection,就像我在其他地方使用列表一样。我不理解这需要一份清单。我希望该列表是Fruit.Color或Fruit.Name中的所有值。gridview shuold显示原始关系,即Apple->Red和Banana->Yellow是值,但如果双击Apple,我会看到包含所有水果对象选项的组合,因此Apple和Banana,以及类似的颜色…它是owrks,但当我这样做时,我在xaml中定义的列将被忽略,并在左侧添加新的列。我可以通过编程为这些自动生成的列设置星形大小吗?您可以关闭自动生成的列。在XAML中的数据网格上:AutoGenerateColumns=“False”谢谢!我不知道前几天我怎么没有试过——试了一千种变体,但都成功了。我想我可能需要阅读更多关于数据绑定的内容。
DataContext = 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; }
}
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
}
dgFruit.ItemsSource = "{Binding}"
<toolkit:DataGrid Name="dgFruit"
ItemsSource="{Binding}">
...
</toolkit:DataGrid>
...
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*" />
<x:Array x:Key="AllColors"
Type="sys:String">
<sys:String>Orange</sys:String>
<sys:String>Yellow</sys:String>
</x:Array>