0

I am pretty new to C# MVVM, WPF . I have a DataGrid in which I can select Multiple Rows, I wanted to get the value of multiple rows as an Array of Objects. I have seen the links like this but could not find what I want Exactly.

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 binding for the datagrid item is given: private string Name;

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

enter code here

for the selected item also binding is given, but I am not getting How to get value multiple selected rows of data grid as an Array of Objects

1 Answers1

0

You could handle the SelectionChanged event in an attached behaviour and the objects to the source collection yourself in the event handler. Please refer to this blog post for an example of how to use behaviours to bind to read-only properties in MVVM.

Your behaviour could be implemented something like this:

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);
        }
    }
}
mm8
  • 163,881
  • 10
  • 57
  • 88