使用Caliburn.Micro在DataGrid中选择多个记录

Dav*_*het 4 wpf caliburn.micro

我有一个使用Caliburn.Micro的WPF应用程序.

DataGrid有一个属性SelectedItem ="{Binding Path = SelectedUsageRecord}"

如您所见,SelectedItem绑定到SelectedUsageRecord属性.但我需要能够处理选择多个记录.这可以将多个记录绑定到集合属性吗?我没有看到像"SelectedItems"这样的东西......谢谢.

小智 6

这是我和你一样的情景后所做的.简而言之,直接处理选择更改事件并从事件args中提取所选行.假设一个"Rows"的源集合,每个都是一个RowViewModel,一个是"_selectedRows"的集合.

<DataGrid RowsSource="{Binding Rows}" x:Name="Rows"                  
          SelectionMode="Extended" SelectionUnit="FullRow">
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="SelectionChanged">
            <cal:ActionMessage MethodName="SelectedRowsChangeEvent">
                <cal:Parameter Value="$eventArgs" />
            </cal:ActionMessage>
        </i:EventTrigger>
    </i:Interaction.Triggers>
</DataGrid>
Run Code Online (Sandbox Code Playgroud)
public void SelectedRowsChangeEvent(SelectionChangedEventArgs e)
{
    foreach (var addedRow in e.AddedRows)
    {
        _selectedRows.Add(addedRow as RowViewModel);
    }

    foreach (var removedRow in e.RemovedRows)
    {
        _selectedRows.Remove(removedRow as RowViewModel);
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 5

我只是想发布我的解决方案。在 Caliburn micro 中,只要您坚持命名约定,就不需要设置源。

xml

<DataGrid x:Name="Rows" SelectionMode="Extended" cal:Message.Attach="[Event SelectionChanged] = [Row_SelectionChanged($eventArgs)]">
Run Code Online (Sandbox Code Playgroud)

C#

public List<MyObject> Rows { get; set; }

public MyObject SelectedRow { get; set; } //Will be set by Caliburn Micro. No need to use "SelectedItem={...}"

List<MyObject> _selectedObjects = new List<MyObject>();    

public void Row_SelectionChanged(SelectionChangedEventArgs obj)
{
  _selectedObjects.AddRange(obj.AddedItems.Cast<MyObject>());
  obj.RemovedItems.Cast<MyObject>().ToList().ForEach(w => _selectedObjects.Remove(w));
}
Run Code Online (Sandbox Code Playgroud)