WPF Toolkit DataGrid Multi-Select:如何获取SelectedItems? [英] WPF Toolkit DataGrid Multi-Select: How to get SelectedItems out?
问题描述
谢谢!
采取比尔的答案,合并选项1和2,添加一个附加的属性的喷洒作为编写代码隐藏的替代品,我想出了一个行为。
首先,我们有以下行为:
公共类SelectedItemsBehavior
公共共享ReadOnly SelectedItemsChangedHandlerProperty作为DependencyProperty =
DependencyProperty.RegisterAttached(SelectedItemsChangedHandler,
GetType(mvvm.RelayCommand),GetType(SelectedItemsBehavior),
New FrameworkPropertyMetadata PropertyChangedCallback(AddressOf OnSelectedItemsChangedHandlerChanged)))
公共共享函数GetSelectedItemsChangedHandler(ByVal元素为DependencyObject)为mvvm.RelayCommand
如果元素为Nothing Then抛出新的ArgumentNullException(element)
返回element.GetValue(SelectedItemsChangedHandlerProperty)
结束函数
公共共享子集SetSelectedItemsChangedHandler(ByVal元素为DependencyObject,ByVal值为mvvm.RelayCommand)
如果元素是Nothing然后抛出新的Arg umentNullException(element)
element.SetValue(SelectedItemsChangedHandlerProperty,value)
End Sub
Private Shared Sub OnSelectedItemsChangedHandlerChanged(d As DependencyObject,$ b $ as As DependencyPropertyChangedEventArgs)
Dim dataGrid As DataGrid = DirectCast(d,DataGrid)
如果e.OldValue不是,还有e.NewValue IsNot Nothing然后
AddHandler dataGrid.SelectionChanged,AddressOf ItemsControl_SelectionChanged
End If
如果e.OldValue IsNot Nothing AndAlso e.NewValue Is Nothing Then
RemoveHandler dataGrid.SelectionChanged,AddressOf ItemsControl_SelectionChanged
End If
End Sub
公共共享子项目Control_SelectionChanged(发件人作为对象,$ b $作为SelectionChangedEventArgs)
Dim DataGrid As DataGrid = DirectCast(sender,DataGrid)
Dim itemsChangedHandler As RelayCommand = GetSelectedItemsChangedHandler(dataGrid)
itemsChangedHandler.Execute(dataGrid.SelectedItems)
End Sub
结束类
C#:
使用Microsoft.VisualBasic;
使用系统;
使用System.Collections;
使用System.Collections.Generic;
使用System.Data;
使用System.Diagnostics;
public class SelectedItemsBehavior
{
public static readonly DependencyProperty SelectedItemsChangedHandlerProperty = DependencyProperty.RegisterAttached(SelectedItemsChangedHandler,typeof(mvvm.RelayCommand),typeof(SelectedItemsBehavior)新的FrameworkPropertyMetadata(新的PropertyChangedCallback(OnSelectedItemsChangedHandlerChanged)));
public static mvvm.RelayCommand GetSelectedItemsChangedHandler(DependencyObject element)
{
if(element == null)
throw new ArgumentNullException 元件);
return element.GetValue(SelectedItemsChangedHandlerProperty);
}
public static void SetSelectedItemsChangedHandler(DependencyObject element,mvvm.RelayCommand value)
{
if(element == null)
throw new ArgumentNullException 元件);
element.SetValue(SelectedItemsChangedHandlerProperty,value);
}
private static void OnSelectedItemsChangedHandlerChanged(DependencyObject d,DependencyPropertyChangedEventArgs e)
{
DataGrid dataGrid =(DataGrid)d;
if(e.OldValue == null&& e.NewValue!= null){
dataGrid.SelectionChanged + = ItemsControl_SelectionChanged;
}
if(e.OldValue!= null&& e.NewValue == null){
dataGrid.SelectionChanged - = ItemsControl_SelectionChanged;
}
}
public static void ItemsControl_SelectionChanged(object sender,SelectionChangedEventArgs e)
{
DataGrid dataGrid =(DataGrid)发件人;
RelayCommand itemsChangedHandler = GetSelectedItemsChangedHandler(dataGrid);
itemsChangedHandler.Execute(dataGrid.SelectedItems);
}
}
然后我们添加它到XAML中的datagrid:
< DataGrid AutoGenerateColumns =FalseFontFamily =TahomaFontSize =9
ItemsSource ={Binding Path = ResultsVM}
mvvm:SelectedItemsBehavior.SelectedItemsChangedHandler ={Binding Path = ResultsSelectionChangedCommand}/>
然后我们在ViewModel中编写RelayCommand:
公开ReadOnly属性ResultsSelectionChangedCommand()作为mvvm.RelayCommand
获取
如果_resultsSelectionChangedCommand是Nothing然后
_resultsSelectionChangedCommand =新的mvvm.RelayCommand(AddressOf ResultsSelectionChanged)
结束如果
返回_resultsSelectionChangedCommand
结束获取
结束属性
公共子结果选择改变(ByVal selectedItems As Object)
_resultsSelectedItems .Clear()
对于每个项目在selectedItems
_resultsSelectedItems.Add(item)
下一个
End Sub
/ pre>
C#:
public mvvm.RelayCommand ResultsSelectionChangedCommand {
get {
if(_resultsSelectionChangedCommand == null){
_resultsS electionChangedCommand = new mvvm.RelayCommand(ResultSelectionChanged);
}
return _resultsSelectionChangedCommand;
}
}
public void ResultsSelectionChanged(object selectedItems)
{
_resultsSelectedItems.Clear();
foreach(items in selectedItems){
_resultsSelectedItems.Add(item);
}
}
_resultsSelectedItems只是一个DataGrid中显示的项目:
私有_resultsSelectedItems作为新列表(WorkOrderMatchViewModel)
C#:
私人列表< WorkOrderMatchViewModel> _resultsSelectedItems = new List< WorkOrderMatchViewModel>();
希望这有助于使用比尔的两种方法,而无需引用MVVM-Light。
I'm using the WPF Toolkit's DataGrid. I've enabled the property on the DataGrid to allow for multi-selecting of rows. How do I get the SelectedItems out? I'm using an MVVM framework to bind my ViewModel to my View.
Thanks!
Taking Bill's answer, merging options 1 and 2, adding a sprinkling of attached properties as an alternative to writing code-behind, I came up with a Behavior.
Firstly, we have the behavior:
Public Class SelectedItemsBehavior
Public Shared ReadOnly SelectedItemsChangedHandlerProperty As DependencyProperty =
DependencyProperty.RegisterAttached("SelectedItemsChangedHandler",
GetType(mvvm.RelayCommand), GetType(SelectedItemsBehavior),
New FrameworkPropertyMetadata(New PropertyChangedCallback(AddressOf OnSelectedItemsChangedHandlerChanged)))
Public Shared Function GetSelectedItemsChangedHandler(ByVal element As DependencyObject) As mvvm.RelayCommand
If element Is Nothing Then Throw New ArgumentNullException("element")
Return element.GetValue(SelectedItemsChangedHandlerProperty)
End Function
Public Shared Sub SetSelectedItemsChangedHandler(ByVal element As DependencyObject, ByVal value As mvvm.RelayCommand)
If element Is Nothing Then Throw New ArgumentNullException("element")
element.SetValue(SelectedItemsChangedHandlerProperty, value)
End Sub
Private Shared Sub OnSelectedItemsChangedHandlerChanged(d As DependencyObject,
e As DependencyPropertyChangedEventArgs)
Dim dataGrid As DataGrid = DirectCast(d, DataGrid)
If e.OldValue Is Nothing AndAlso e.NewValue IsNot Nothing Then
AddHandler dataGrid.SelectionChanged, AddressOf ItemsControl_SelectionChanged
End If
If e.OldValue IsNot Nothing AndAlso e.NewValue Is Nothing Then
RemoveHandler dataGrid.SelectionChanged, AddressOf ItemsControl_SelectionChanged
End If
End Sub
Public Shared Sub ItemsControl_SelectionChanged(sender As Object,
e As SelectionChangedEventArgs)
Dim dataGrid As DataGrid = DirectCast(sender, DataGrid)
Dim itemsChangedHandler As RelayCommand = GetSelectedItemsChangedHandler(dataGrid)
itemsChangedHandler.Execute(dataGrid.SelectedItems)
End Sub
End Class
C#:
using Microsoft.VisualBasic;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
public class SelectedItemsBehavior
{
public static readonly DependencyProperty SelectedItemsChangedHandlerProperty = DependencyProperty.RegisterAttached("SelectedItemsChangedHandler", typeof(mvvm.RelayCommand), typeof(SelectedItemsBehavior), new FrameworkPropertyMetadata(new PropertyChangedCallback(OnSelectedItemsChangedHandlerChanged)));
public static mvvm.RelayCommand GetSelectedItemsChangedHandler(DependencyObject element)
{
if (element == null)
throw new ArgumentNullException("element");
return element.GetValue(SelectedItemsChangedHandlerProperty);
}
public static void SetSelectedItemsChangedHandler(DependencyObject element, mvvm.RelayCommand value)
{
if (element == null)
throw new ArgumentNullException("element");
element.SetValue(SelectedItemsChangedHandlerProperty, value);
}
private static void OnSelectedItemsChangedHandlerChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
DataGrid dataGrid = (DataGrid)d;
if (e.OldValue == null && e.NewValue != null) {
dataGrid.SelectionChanged += ItemsControl_SelectionChanged;
}
if (e.OldValue != null && e.NewValue == null) {
dataGrid.SelectionChanged -= ItemsControl_SelectionChanged;
}
}
public static void ItemsControl_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
DataGrid dataGrid = (DataGrid)sender;
RelayCommand itemsChangedHandler = GetSelectedItemsChangedHandler(dataGrid);
itemsChangedHandler.Execute(dataGrid.SelectedItems);
}
}
Then we add it to the datagrid in XAML:
<DataGrid AutoGenerateColumns="False" FontFamily="Tahoma" FontSize="9"
ItemsSource="{Binding Path=ResultsVM}"
mvvm:SelectedItemsBehavior.SelectedItemsChangedHandler="{Binding Path=ResultsSelectionChangedCommand}" />
Then we code the RelayCommand in the ViewModel:
Public ReadOnly Property ResultsSelectionChangedCommand() As mvvm.RelayCommand
Get
If _resultsSelectionChangedCommand Is Nothing Then
_resultsSelectionChangedCommand = New mvvm.RelayCommand(AddressOf ResultsSelectionChanged)
End If
Return _resultsSelectionChangedCommand
End Get
End Property
Public Sub ResultsSelectionChanged(ByVal selectedItems As Object)
_resultsSelectedItems.Clear()
For Each item In selectedItems
_resultsSelectedItems.Add(item)
Next
End Sub
C#:
public mvvm.RelayCommand ResultsSelectionChangedCommand {
get {
if (_resultsSelectionChangedCommand == null) {
_resultsSelectionChangedCommand = new mvvm.RelayCommand(ResultsSelectionChanged);
}
return _resultsSelectionChangedCommand;
}
}
public void ResultsSelectionChanged(object selectedItems)
{
_resultsSelectedItems.Clear();
foreach (item in selectedItems) {
_resultsSelectedItems.Add(item);
}
}
The _resultsSelectedItems is simply a list of items displayed in the DataGrid:
Private _resultsSelectedItems As New List(Of WorkOrderMatchViewModel)
C#:
private List<WorkOrderMatchViewModel> _resultsSelectedItems = new List<WorkOrderMatchViewModel>();
Hope this helps, kinda uses both of Bill's methods without having to reference MVVM-Light.
这篇关于WPF Toolkit DataGrid Multi-Select:如何获取SelectedItems?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!