BindingContext和Multiselected datagridview

时间:2011-12-30 18:54:33

标签: c# binding

使用BindingContext获取当前对象没有问题,但是当我在datagridview中选择了多行时该怎么办?如何遍历每个对象?

2 个答案:

答案 0 :(得分:2)

这不容易或有趣。默认情况下,不支持绑定数据网格中的多个选定行。我使用Functional Fun中的MultiSelectBehavior:

http://blog.functionalfun.net/2009/02/how-to-databind-to-selecteditems.html

以下是我的工作说明:

为了实现这一点,我做到了这一点:

将此命名空间定义添加到视图中: 的xmlns:FF = “CLR-名称空间:FunctionalFun.UI.Behaviours;装配= MultiSelectBehavior”

在datagrid中,添加此处显示的最后两行(ff:...和SelectionMode ....):                                      ff:MultiSelectorBehaviours.SynchronizedSelectedItems =“{Binding SelectedTasks}”                        的的SelectionMode = “扩展”

注意:在视图模型中,即使首次声明,SelectedTasks也不能为空。

否:私人ObservableCollection selectedTasks;

是:私有ObservableCollection selectedTasks = new ObservableCollection();

这是一些有效的实际代码:

xmlns:ff="clr-namespace:FunctionalFun.UI.Behaviours;assembly=MultiSelectBehavior"

        <DataGrid Grid.Row="1" AutoGenerateColumns="False" IsReadOnly="True" HeadersVisibility="Column"
                  ItemsSource="{Binding SelectedApplicationServer.ApplicationsWithOverrideGroup}"
                  ff:MultiSelectorBehaviours.SynchronizedSelectedItems="{Binding SelectedApplicationsWithOverrideGroup}"
                  SelectionMode="Extended">
            <DataGrid.Columns>
                <DataGridTextColumn Binding="{Binding Path=Application.Name}" Header="Name" Width="150" />
                <DataGridTextColumn Binding="{Binding Path=Application.Version}" Header="Version" Width="100"/>
                <DataGridTextColumn Binding="{Binding Path=CustomVariableGroup.Name}" Header="Override Group" Width="*"/>
            </DataGrid.Columns>
        </DataGrid>

希望它有所帮助。

编辑:我只是将Functional Fun代码添加为我的解决方案中的项目,然后我在我的视图项目中引用它:

enter image description here

enter image description here

答案 1 :(得分:0)

假设您的DataGridView绑定到BindingSource,请使用DataMember属性:

myDataGridView.DataSource = someBindingSource;
myDataGridView.DataMember = "SomeCollectionProperty";

然后,您可以检索DataGridView

后面的绑定项列表
IList dataBoundItems = 
          ((CurrencyManager)grid.BindingContext[grid.DataSource, grid.DataMember]).List;

您可能还希望使用以下内容将此列表转换为IEnumerable<T>

var myItems = dataBoundItems.OfType<myClass>();