【发布时间】:2014-09-04 21:44:09
【问题描述】:
问题已解决,但仍有疑问。见文末,或继续阅读上下文。
我正在尝试设置一个 WPF 数据网格,其中包含许多带有组合框的模板列。特别是我在数据绑定方面遇到了麻烦。
数据模型
首先,我有Entry,它包含4个属性:
NameCustomerColorType
最有趣的属性是Color,它还有两个子属性:
ColorStringIndex
目标
我需要创建一个数据网格,其中每一行对应一个Entry 对象。 Customer、Color 和 Type 属性都有允许选择动态填充选项的组合框。我需要将每个组合框的选定项绑定到条目的各自属性。
截图
问题:
如何正确设置数据网格和每个组合框的数据上下文?
对于数据网格,我以编程方式将数据上下文设置为 ObservableCollection 的一个实例。
private ObservableCollection<Entry> entries = new ObservableCollection<Entry>();
public MainWindow()
{
InitializeComponent();
entries.Add(new Entry("Foo", "Customer1", new MyColor("#00000000", 1), "Type1"));
entries.Add(new Entry("Bar", "Customer2", new MyColor("#00000000", 1), "Type2"));
LayerMapGrid.DataContext = entries; //Set data-context of datagrid
}
对于颜色组合框,我在 XAML 中使用 ObjectDataProvider:
<Window.Resources>
<ObjectDataProvider x:Key="Colors" ObjectType="{x:Type local:MyColor}" MethodName="GetColors"/>
</Window.Resources>
这就是我绑定 ObjectDataProvider 的方式
<ComboBox ItemsSource="{Binding Source={StaticResource Colors}}"/>
在MyColor 类中,我创建了以下方法:
public static ObservableCollection<MyColor> GetColors()
{
ObservableCollection<MyColor> colors = new ObservableCollection<MyColor>();
//... Fill collection... (omitted for brevity)
return colors;
}
好消息是上述所有代码都可以工作。然而,这是解决手头问题的好方法吗?
这是我的下一个更重要的问题:
如何绑定组合框的选定项以更新 ObservableCollection<Entry>?
我知道我需要设置UpdateSourceTrigger="PropertyChanged",以便更新我的来源,即Entry 集合。
这是我当前用于设置整个数据网格的 XAML 代码。注意:我还没有实现客户和类型组合框。我真的只关心颜色组合框:
<DataGrid ItemsSource="{Binding}" AutoGenerateColumns="False" Name="LayerMapGrid">
<DataGrid.Columns>
<!--Name Column-->
<DataGridTemplateColumn Header="Name">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Label Content="{Binding Name, UpdateSourceTrigger=PropertyChanged}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.HeaderStyle>
<Style TargetType="DataGridColumnHeader">
<Setter Property="Control.HorizontalContentAlignment" Value="Center" />
</Style>
</DataGridTemplateColumn.HeaderStyle>
</DataGridTemplateColumn>
<!--Customer Column-->
<DataGridTemplateColumn Header="Customer">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox SelectedItem="{Binding CustomerName, UpdateSourceTrigger=PropertyChanged}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<!--Color Column-->
<DataGridTemplateColumn Header="Color">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding Source={StaticResource Colors}}" SelectedItem="{Binding Color, ElementName=LayerMapGrid, UpdateSourceTrigger=PropertyChanged}">
<ComboBox.ItemTemplate>
<DataTemplate>
<DockPanel Margin="2">
<Border DockPanel.Dock="Left" HorizontalAlignment="Right" BorderThickness="1" BorderBrush="Black" Margin="1" Width="10" Height="10">
<Rectangle Name="ColorRec" Fill="{Binding ColorString}"/>
</Border>
<TextBlock Padding="4,2,2,2" Text="{Binding ColorString}" VerticalAlignment="Center"/>
</DockPanel>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<!--Type Column-->
<DataGridTemplateColumn Header="Type">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox SelectedItem="{Binding Type, UpdateSourceTrigger=PropertyChanged}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
非常感谢您的帮助。我已经用这个把头撞在墙上大约 16 个小时了。
-尼克·米勒
编辑:
我找到了解决方案(并且总是在请求帮助后立即找到),但我不明白它是如何工作的。
在 XAML 中,我已将组合框绑定更改为以下内容:
<ComboBox ItemsSource="{Binding Source={StaticResource Colors}}" SelectedItem="{Binding Color, UpdateSourceTrigger=PropertyChanged}">
这里到底发生了什么?
为什么组合框现在指的是数据网格的数据上下文?当我将 ItemsSource 设置为指向我的 ObjectDataProvider 时,这不会被覆盖吗?
【问题讨论】:
-
你的问题很长!如果你再也没有收到我的消息,我就没有通过。
-
哈哈,那是因为我想详细阐述。无论如何,我发现了问题,但对它为什么起作用感到困惑。看我帖子的结尾:)
标签: wpf data-binding combobox wpfdatagrid datagridtemplatecolumn