Как я могу получить коллекцию выбранных строк в DataGrid? MVVM WPF - PullRequest
0 голосов
/ 15 апреля 2020

Добрый день, я пытаюсь получить список выбранных строк в DataGrid, однако SelectedItem возвращает только выбранную строку, а не их список. = [

Я использую Caliburn Micro для MVVM в моем проекте WPF.

--- это мой 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> 

--- Это мой список в ViewModel ---

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

--- я получаю эту ошибку ---

Превосходно: "System.NotSupportedException" em PresentationFramework.dll System. Windows .Data Ошибка: 7: ConvertBack не может преобразовать значение «MiniAgendadaTay.Models.AvisoModel» (тип «AvisoModel»). BindingExpression: Path = SelectedRows; DataItem = 'MainWindowViewModel' (HashCode = 10588721); целевой элемент - «DataGrid» (имя = «Avisos»); Свойство target - «SelectedItem» (тип «Object») NotSupportedException: «System.NotSupportedException: CollectionConverter не может преобразовать из MiniAgendadaTay.Models.AvisoModel. в MS.Internal.Data.DefaultValueConverter.ConvertHelper (Object o, Тип destinationType, DependencyObject targetElement, CultureInfo culture, Boolean isForward) в MS.Internal.Data.ObjectTargetConverter.ConvertBack (Object o, Тип типа, Объектный параметр, CultureInfo culture) в System. Windows .Data.BindingExpression.ConvertBackHelper (конвертер IValueConverter, значение объекта, тип sourceType, параметр объекта, культура CultureInfo) '

1 Ответ

0 голосов
/ 17 апреля 2020

Вы можете определить как Поведение, которое использует свойство SelectedItems DataGrid. SelectedItems не является DepedencyProperty, поэтому вы не можете сделать это с полки.

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

Теперь вы можете добавить поведение в вашем Xaml как

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

И в вашей ViewModel

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