0
votes

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

1 Answers

0
votes

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; }