如何在C#WPF MVVM中获取Datagrid的多个选定行的值

如何在C#WPF MVVM中获取Datagrid的多个选定行的值,c#,wpf,mvvm,C#,Wpf,Mvvm,我对C#MVVM、WPF还是个新手。我有一个DataGrid,在其中我可以选择多行,我想获得多行作为对象数组的值。 我已经看到了这样的链接,但无法找到我想要的确切内容 enter code here <DataGrid ScrollViewer.CanContentScroll="True" VerticalScrollBarVisibility="Auto" SelectionUnit="FullRow" BorderThickness="1" x:Name="ssa" CanUs

我对C#MVVM、WPF还是个新手。我有一个DataGrid,在其中我可以选择多行,我想获得多行作为对象数组的值。 我已经看到了这样的链接,但无法找到我想要的确切内容

enter code here
<DataGrid ScrollViewer.CanContentScroll="True"   VerticalScrollBarVisibility="Auto" SelectionUnit="FullRow"  BorderThickness="1" x:Name="ssa" CanUserAddRows="False" CanUserDeleteRows="False"  AutoGenerateColumns="False"  ItemsSource="{Binding Items,UpdateSourceTrigger=PropertyChanged}"   IsSynchronizedWithCurrentItem="True" GridLinesVisibility="All"   
                HorizontalScrollBarVisibility="Auto" SelectionMode="Single" Height="280" Width="1600" SelectedItem="{Binding selected_row}">

                <DataGrid.ContextMenu>
                    <ContextMenu>
                        <MenuItem Header="Get item" Command="{Binding get_item}" CommandParameter="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContextMenu}}, Path=PlacementTarget.SelectedItems}">
                        </MenuItem>
在此处输入代码


对于选定项,也提供了绑定,但我不知道如何将多个选定的数据网格行作为对象数组来获取值

您可以在附加的行为中处理
SelectionChanged
事件,并在事件处理程序中自己处理源集合的对象。有关如何使用行为绑定到MVVM中的只读属性的示例,请参阅博客文章

您的行为可以实现如下内容:

public class DataGridSelectedItemsBlendBehavior : Behavior<DataGrid>
{
    public static readonly DependencyProperty SelectedItemsProperty =
        DependencyProperty.Register("SelectedItems", typeof(object),
        typeof(DataGridSelectedItemsBlendBehavior ),
        new FrameworkPropertyMetadata(null) { BindsTwoWayByDefault = true });

    public IList SelectedItems
    {
        get { return (IList)GetValue(SelectedItemsProperty); }
        set { SetValue(SelectedItemsProperty, value); }
    }

    protected override void OnAttached()
    {
        base.OnAttached();
        this.AssociatedObject.SelectionChanged += OnSelectionChanged;
    }

    protected override void OnDetaching()
    {
        base.OnDetaching();
        if (this.AssociatedObject != null)
            this.AssociatedObject.SelectionChanged -= OnSelectionChanged;
    }

    private void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        if (SelectedItems != null)
        {
            foreach (var selectedItem in e.AddedItems)
                if (!SelectedItems.Contains(selectedItem))
                    SelectedItems.Add(selectedItem);

            foreach (var unselectedItem in e.RemovedItems)
                SelectedItems.Remove(unselectedItem);
        }
    }
}
公共类DataGridSelectedEditEmsBlendBehavior:Behavior
{
公共静态只读从属属性SelectedItemsProperty=
DependencyProperty.Register(“SelectedItems”,类型为(对象),
类型(DataGridSelectedItemsBlendBehavior),
新的FrameworkPropertyMetadata(null){BindsTwoWayByDefault=true});
公共IList SelectedItems
{
获取{return(IList)GetValue(SelectedItemsProperty);}
set{SetValue(selecteditemsprroperty,value);}
}
受保护的覆盖无效附加()
{
base.onatached();
this.AssociatedObject.SelectionChanged+=OnSelectionChanged;
}
附加时受保护的覆盖无效()
{
base.OnDetaching();
if(this.AssociatedObject!=null)
this.AssociatedObject.SelectionChanged-=OnSelectionChanged;
}
SelectionChanged上的私有无效(对象发送方,SelectionChangedEventArgs e)
{
如果(SelectedItems!=null)
{
foreach(e.AddedItems中的变量selectedItem)
如果(!SelectedItems.Contains(selectedItem))
SelectedItems.Add(selectedItem);
foreach(e.RemovedItems中的var unselectedItem)
选择编辑项。删除(取消选择编辑项);
}
}
}

bind
SelectedItems
到一个可观察对象collection@BizhanSelectedItems没有公共设置器。无法约束。这是否回答了您的问题?
    public string name
    {
        get { return Name; }
        set { Name = value; RaisePropertyChanged("name"); }
    }
public class DataGridSelectedItemsBlendBehavior : Behavior<DataGrid>
{
    public static readonly DependencyProperty SelectedItemsProperty =
        DependencyProperty.Register("SelectedItems", typeof(object),
        typeof(DataGridSelectedItemsBlendBehavior ),
        new FrameworkPropertyMetadata(null) { BindsTwoWayByDefault = true });

    public IList SelectedItems
    {
        get { return (IList)GetValue(SelectedItemsProperty); }
        set { SetValue(SelectedItemsProperty, value); }
    }

    protected override void OnAttached()
    {
        base.OnAttached();
        this.AssociatedObject.SelectionChanged += OnSelectionChanged;
    }

    protected override void OnDetaching()
    {
        base.OnDetaching();
        if (this.AssociatedObject != null)
            this.AssociatedObject.SelectionChanged -= OnSelectionChanged;
    }

    private void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        if (SelectedItems != null)
        {
            foreach (var selectedItem in e.AddedItems)
                if (!SelectedItems.Contains(selectedItem))
                    SelectedItems.Add(selectedItem);

            foreach (var unselectedItem in e.RemovedItems)
                SelectedItems.Remove(unselectedItem);
        }
    }
}