WPF Toolkit DataGrid Multi-Select:如何获取SelectedItems? [英] WPF Toolkit DataGrid Multi-Select: How to get SelectedItems out?

查看:171
本文介绍了WPF Toolkit DataGrid Multi-Select:如何获取SelectedItems?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用WPF Toolkit的DataGrid。我启用DataGrid上的属性允许多行选择。如何获取SelectedItems?我使用MVVM框架将ViewModel绑定到我的View。



谢谢!

解决方案

采取比尔的答案,合并选项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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆