2011-12-30 2 views
2

Получение текущего объекта с BindingContext не проблема, но что мне делать, когда я выбрал много строк в datagridview? Как выполнять итерацию по каждому объекту? thanksBindingContext и многопользовательский datagridview

+1

ли мой ответ вам помочь? –

+0

Это наверняка поможет пользователям WPF :) Вопрос звучит скорее из-за winforms. – Larry

ответ

2

Это было нелегко или весело. По умолчанию привязка нескольких выбранных строк в datagrid не поддерживается. Я использую MultiSelectBehavior от функционального Fun:

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

Это мои заметки, чтобы заставить его работать:

Чтобы получить эту работу, я сделал это:

Добавить это определение пространства имен к вид: XMLNS: ФФ = "CLR-пространств имен: FunctionalFun.UI.Behaviours; сборочные = MultiSelectBehavior"

в DataGrid, добавьте последние две строки, показанные здесь (ФФ: ... и SelectionMode ... .): ФФ: MultiSelectorBehaviours.SynchronizedSelectedItems = "{Binding} SelectedTasks" SelectionMode = "Расширенная"

Примечание: В модели представления, SelectedTasks не может быть нулевым, даже тогда, когда первая объявлена.

No: private ObservableCollection selectedTasks;

Да: private 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> 

Надеется, что это помогает.

Edit: Я просто добавил функциональный код Fun в качестве проекта в моем решении, и тогда я ссылаться его в моей точки зрения проекта:

enter image description here

enter image description here

+0

У меня возникла проблема с использованием вышеуказанного кода. Я добавлял новые элементы в объект SynchronizedSelectedItems. Чтобы устранить проблему, я прекратил создавать новые элементы и начал добавлять элементы из объекта ItemSource.Поэтому я зациклился на ItemSource, чтобы найти правильный элемент для добавления в SyncronizedSelectedItems вместо того, чтобы сказать, что я знаю, что ItemSource содержит то, что равно XX, поэтому создайте новый элемент из XX и добавьте его в SyncronizedSelectedItems. Во всяком случае, спасибо за код, люблю его, отлично работает. –

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>(); 
Смежные вопросы