首页 > 解决方案 > 如何在 C# WPF MVVM 中获取 Datagrid 的多个选定行的值

问题描述

我对 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>

            <DataGrid.Columns>


                <DataGridTextColumn Width="150" x:Name="item_name"  Binding="{Binding name,  Mode=TwoWay, UpdateSourceTrigger=PropertyChanged,ValidatesOnDataErrors=True}" FocusManager.FocusedElement="{Binding RelativeSource={RelativeSource Self}}">

数据网格项的 Viewmodel.cs 绑定给出:私有字符串名称;

    public string name
    {
        get { return Name; }
        set { Name = value; RaisePropertyChanged("name"); }
    }

enter code here

对于选定的项目也给出了绑定,但我没有得到如何将多个选定的数据网格行作为对象数组获取值

标签: c#wpfmvvm

解决方案


您可以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);
        }
    }
}

推荐阅读