How can I get a collection of selected rows in the DataGrid? MVVM WPF

416 Views Asked by At

Good afternoon, I'm trying to get the list of selected rows in the DataGrid, however SelectedItem returns only a selected row, not a list of them. =[

I am using Caliburn Micro for MVVM in my WPF project.

---this is my Datagrid---

<DataGrid Margin="5" AutoGenerateColumns="False" VerticalAlignment="Stretch" HorizontalAlignment="Stretch"
      CanUserAddRows="False"  SelectionMode="Extended"  MinHeight="320"
      SelectedItem="{Binding Path=SelectedRows, Mode=OneWayToSource}"  x:Name="Avisos" SelectionUnit="FullRow">
            <DataGrid.Columns>
                <DataGridTextColumn Header="Inquilino"  Binding="{Binding Inquilino}" MinWidth="150"/>
                <DataGridTextColumn Header="Propietário" Binding="{Binding Propietario}" MinWidth="150"/>
                <DataGridTextColumn Header="Imovel"  Binding="{Binding Imovel}" MinWidth="150"/>
                <DataGridTextColumn Header="Data Aviso" Binding="{Binding DataLembrete}" MinWidth="150"/>
                <DataGridTextColumn Header="Status" Binding="{Binding Status}" MinWidth="70"/>
                <DataGridTextColumn Header="Descrição" Binding="{Binding Descrição}" MinWidth="150" Width="*"/>
            </DataGrid.Columns>                
    <DataGrid> 

---This is my list on the ViewModel---

public ObservableCollection<AvisoModel> SelectedRows { get; set; }

---I get this error---

Exceção gerada: 'System.NotSupportedException' em PresentationFramework.dll System.Windows.Data Error: 7 : ConvertBack cannot convert value 'MiniAgendadaTay.Models.AvisoModel' (type 'AvisoModel'). BindingExpression:Path=SelectedRows; DataItem='MainWindowViewModel' (HashCode=10588721); target element is 'DataGrid' (Name='Avisos'); target property is 'SelectedItem' (type 'Object') NotSupportedException:'System.NotSupportedException: CollectionConverter cannot convert from MiniAgendadaTay.Models.AvisoModel. at MS.Internal.Data.DefaultValueConverter.ConvertHelper(Object o, Type destinationType, DependencyObject targetElement, CultureInfo culture, Boolean isForward) at MS.Internal.Data.ObjectTargetConverter.ConvertBack(Object o, Type type, Object parameter, CultureInfo culture) at System.Windows.Data.BindingExpression.ConvertBackHelper(IValueConverter converter, Object value, Type sourceType, Object parameter, CultureInfo culture)'

1

There are 1 best solutions below

0
Anu Viswan On BEST ANSWER

You could define as Behavior which makes use of the SelectedItems property of DataGrid. SelectedItems, is not a DepedencyProperty, which is why you cannot do this off the shelf.

public class DataGridSelectedItemsBehavior:Behavior<DataGrid>
{
    protected override void OnAttached()
    {
        AssociatedObject.SelectionChanged += SelectionChanged;
    }

    protected override void OnDetaching()
    {
        AssociatedObject.SelectionChanged -= SelectionChanged;
    }

    void SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        SelectedItems = AssociatedObject.SelectedItems;
    }

    public static readonly DependencyProperty SelectedItemsProperty =
        DependencyProperty.Register(nameof(SelectedItems), typeof(IEnumerable), typeof(DataGridSelectedItemsBehavior),
        new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));

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

Now you can add the behavior in your Xaml as

<i:Interaction.Behaviors>
    <behaviors:DataGridSelectedItemsBehavior SelectedItems="{Binding SelectedItems, Mode=OneWayToSource}" />
</i:Interaction.Behaviors>

And in your ViewModel

public IEnumerable<object> SelectedItems { get; set; }