【问题标题】:How can I get a collection of selected rows in the DataGrid? MVVM WPF如何获取 DataGrid 中选定行的集合? MVVM WPF
【发布时间】:2020-04-15 18:34:41
【问题描述】:

下午好, 我正在尝试获取 DataGrid 中选定行的列表,但是 SelectedItem 仅返回选定行,而不是它们的列表。 =[

我在我的 WPF 项目中使用 Caliburn Micro for MVVM。

---这是我的数据网格---

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

---我得到这个错误---

Exceção gerada: 'System.NotSupportedException' em PresentationFramework.dll System.Windows.Data 错误:7:ConvertBack 无法转换值“MiniAgenadaTay.Models.AvisoModel”(类型“AvisoModel”)。 BindingExpression:Path=SelectedRows; DataItem='MainWindowViewModel' (HashCode=10588721);目标元素是“DataGrid”(名称=“Avisos”);目标属性是'SelectedItem'(类型'Object')NotSupportedException:'System.NotSupportedException:CollectionConverter 无法从 MiniAgendadaTay.Models.AvisoModel 转换。 在 MS.Internal.Data.DefaultValueConverter.ConvertHelper(对象 o,类型 destinationType,DependencyObject targetElement,CultureInfo 文化,布尔 isForward) 在 MS.Internal.Data.ObjectTargetConverter.ConvertBack(对象 o,类型类型,对象参数,CultureInfo 文化) 在 System.Windows.Data.BindingExpression.ConvertBackHelper(IValueConverter 转换器,对象值,类型 sourceType,对象参数,CultureInfo 文化)'

【问题讨论】:

    标签: c# mvvm caliburn.micro caliburn


    【解决方案1】:

    您可以定义为利用 DataGrid 的 SelectedItems 属性的行为。 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; }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-16
      • 2017-08-18
      • 2016-10-13
      • 2011-04-24
      • 1970-01-01
      • 1970-01-01
      • 2013-03-21
      相关资源
      最近更新 更多