MVVM,DataGrid,ComboBox,数据绑定完美实现—MY80博客WPF专题

阅读:1352次 | 发布时间:2012/12/13 14:07:29
MVVM模式下DataGrid中嵌入ComboBox并数据绑定,这里给出一个完美的解决方案,首先是准备好数据源,下面代码中蓝色部分就是数据源,如何创建数据源这里不赘述,可以查看“采用MVVM数据绑定TreeView控件—陈宽博客WPF专题”这篇文章来学习。注意下面代码的红色部分是关键性代码。
<DataGrid ItemsSource="{BindingProductList}" AutoGenerateColumns="False"
                  Name="GridProduct" AlternatingRowBackground="Azure"
                  BorderThickness="1" VerticalGridLinesBrush="LightGray"
                  HorizontalGridLinesBrush="LightGray" Grid.Row="1" SelectionChanged="GiveProduct">
            <DataGrid.Columns>
                <DataGridTemplateColumn Header="选择">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <CheckBox IsChecked="{Binding IsChecked, UpdateSourceTrigger=PropertyChanged}" Margin="5"/>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
                <DataGridTextColumn Header="产品名称" Width="100" Binding="{Binding ProductName}"/>
                <DataGridTextColumn Header="材质" Width="80" Binding="{Binding Material}"/>
                <DataGridTextColumn Header="规格" Width="80" Binding="{Binding ProductSpec}"/>
                <DataGridTextColumn Header="公差" Width="80" Binding="{Binding Tolerance}"/>
                <DataGridTextColumn Header="产地" Width="80" Binding="{Binding Address}"/>
                
                <DataGridComboBoxColumn Header="供应商">
                    <DataGridComboBoxColumn.EditingElementStyle>
                        <Style TargetType="ComboBox">
                            <Setter Property="ItemsSource" Value="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=DataContext.ProductSupplier}" />
                            <Setter Property="SelectedValue" Value="{Binding Supplier, UpdateSourceTrigger=PropertyChanged}" />
                            <Setter Property="SelectedValuePath" Value="ID" />
                            <Setter Property="DisplayMemberPath" Value="SupplierCompany" />
                        </Style>
                    </DataGridComboBoxColumn.EditingElementStyle>
                    <DataGridComboBoxColumn.ElementStyle>
                        <Style TargetType="ComboBox">
                            <Setter Property="ItemsSource" Value="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=DataContext.ProductSupplier}" />
                            <Setter Property="SelectedValue" Value="{Binding Supplier, UpdateSourceTrigger=PropertyChanged}" />
                            <Setter Property="SelectedValuePath" Value="ID" />
                            <Setter Property="DisplayMemberPath" Value="SupplierCompany" />
                        </Style>
                    </DataGridComboBoxColumn.ElementStyle>
                </DataGridComboBoxColumn>
                <DataGridTextColumn Header="备注" Binding="{Binding Memo}"/>

            </DataGrid.Columns>
            <DataGrid.ContextMenu>
                <ContextMenu Name="dgmenu1" StaysOpen="true">
                    <MenuItem Header="添加" Command="{Binding SaveCommand}">
                        <MenuItem.Icon>
                            <Image Source="/WPF_SAAMS;component/Resource/add.png" />
                        </MenuItem.Icon>
                    </MenuItem>
                    <MenuItem Header="修改" Command="{Binding UpdateCommand}">
                        <MenuItem.Icon>
                            <Image Source="/WPF_SAAMS;component/Resource/save.png" />
                        </MenuItem.Icon>
                    </MenuItem>
                    <MenuItem Header="删除" Command="{Binding DelCommand}">
                        <MenuItem.Icon>
                            <Image Source="/WPF_SAAMS;component/Resource/Del.png" />
                        </MenuItem.Icon>
                    </MenuItem>
                </ContextMenu>
            </DataGrid.ContextMenu>
        </DataGrid>
0