简体   繁体   English

如何使用 SelectionMode="Extended" 在 MVVM 中设置所选项目?

[英]How to set selected items in MVVM using SelectionMode=“Extended”?

Goal目标

I currently have an app that select the items only by selecting the check box.我目前有一个仅通过选中复选框来选择项目的应用程序。 Like so:像这样:

在此处输入图片说明

My goal is to multi select items (Which highlights the selected rows), right click and have a data context menu item to select, selected items.我的目标是多选项目(突出显示选定的行),右键单击并有一个数据上下文菜单项来选择,选定的项目。

Desired Output期望输出

As an example, this would be my desired output (Obviously not selecting the checkboxes manually).例如,这将是我想要的输出(显然不是手动选择复选框)。

在此处输入图片说明

Question问题

What would a good starting point to achieve this output?实现此输出的良好起点是什么? I couldn't find any examples.我找不到任何例子。

Code代码

The Model is pretty simple.模型非常简单。

public class OrdersModel : BaseVM
{
    public int OrderId { get; set; } // Hidden
    public string OrderNumber { get; set; }
    public DateTime OrderDate { get; set; }
    private bool _selectedRecord;
    public bool SelectedRecord
    {
        get { return _selectedRecord; }
        set
        {
            _selectedRecord = value;
            OnPropertyChanged();
        }
    }
}

And this is my current XAML.这是我当前的 XAML。

<DataGrid ItemsSource="{Binding Orders}"
          AutoGenerateColumns="False"
          SelectionMode="Extended"
          CanUserAddRows="False">
    <DataGrid.RowStyle>
        <Style TargetType="DataGridRow">
            <Style.Triggers>
                <DataTrigger Binding="{Binding Path=SelectedRecord}" Value="True">
                    <Setter Property="Background" Value="LightGray" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </DataGrid.RowStyle>
    
    <!--Columns Used-->
    <DataGrid.Columns>

        <!--Select All Column-->
        <DataGridTemplateColumn>
            <DataGridTemplateColumn.HeaderTemplate>
                <DataTemplate>
                    <CheckBox Content="Select All"
                              IsChecked="{Binding DataContext.SelectAll, RelativeSource={RelativeSource FindAncestor, AncestorType=DataGrid}}"
                              Command="{Binding DataContext.ToggleAllOrdersCommand, RelativeSource={RelativeSource FindAncestor, AncestorType=DataGrid}}"/>
                </DataTemplate>
            </DataGridTemplateColumn.HeaderTemplate>

            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <CheckBox IsChecked="{Binding Path=SelectedRecord, UpdateSourceTrigger=PropertyChanged}" />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>

        <DataGridTextColumn Header="Order Date"
                            Binding="{Binding OrderDate, StringFormat='{}{0:MM-dd-yyyy}'}" Width="*"
                            IsReadOnly="True"
                            FontSize="14" />
        <DataGridTextColumn Header="Order Number"
                            Binding="{Binding OrderNumber}" Width="*"
                            IsReadOnly="True"
                            FontSize="14" />
    </DataGrid.Columns>

    <!--Menu Options-->
    <DataGrid.ContextMenu>
        <ContextMenu>
            <MenuItem Header="Select Highlighted Rows" />
        </ContextMenu>
    </DataGrid.ContextMenu>
</DataGrid>

This solution worked for me.这个解决方案对我有用。 I took the liberty of changing some of your property names to avoid confusion as to what is "selected" and what is "checked".我冒昧地更改了您的一些属性名称,以避免混淆“已选择”和“已检查”的内容。

OrdersModel:订单型号:

public class OrdersModel : BaseVM
{
    public int OrderId { get; set; } // Hidden
    public string OrderNumber { get; set; }
    public DateTime OrderDate { get; set; }
    private bool _selected;
    private bool _checked;
    public bool Selected
    {
        get { return _selected; }
        set { _selected = value; OnPropertyChanged(); }
    }
    public bool Checked
    {
        get { return _checked; }
        set { _checked = value; OnPropertyChanged(); }
    }
}

MainWindow.xaml.cs主窗口.xaml.cs

<DataGrid ItemsSource="{Binding Orders}"
  AutoGenerateColumns="False"
  SelectionMode="Extended"
  CanUserAddRows="False"
  Tag="{Binding ElementName=myWindow,Path=DataContext}"
          >
    <DataGrid.RowStyle>
        <Style TargetType="DataGridRow">
            <Setter Property="IsSelected" Value="{Binding Selected}"/>
            <Style.Triggers>
                <DataTrigger Binding="{Binding Path=Selected}" Value="True">
                    <Setter Property="Background" Value="LightGray" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </DataGrid.RowStyle>

    <!--Columns Used-->
    <DataGrid.Columns>

        <!--Select All Column-->
        <DataGridTemplateColumn>
            <DataGridTemplateColumn.HeaderTemplate>
                <DataTemplate>
                    <CheckBox Content="Select All"
                      IsChecked="{Binding DataContext.SelectAll, RelativeSource={RelativeSource FindAncestor, AncestorType=DataGrid}}"
                      Command="{Binding DataContext.ToggleAllOrdersCommand, RelativeSource={RelativeSource FindAncestor, AncestorType=DataGrid}}"/>
                </DataTemplate>
            </DataGridTemplateColumn.HeaderTemplate>

            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <CheckBox IsChecked="{Binding Path=Checked, UpdateSourceTrigger=PropertyChanged}" />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>

        <DataGridTextColumn Header="Order Date"
                    Binding="{Binding OrderDate, StringFormat='{}{0:MM-dd-yyyy}'}" Width="*"
                    IsReadOnly="True"
                    FontSize="14" />
        <DataGridTextColumn Header="Order Number"
                    Binding="{Binding OrderNumber}" Width="*"
                    IsReadOnly="True"
                    FontSize="14" />
    </DataGrid.Columns>

    <!--Menu Options-->
    <DataGrid.ContextMenu>
        <ContextMenu DataContext="{Binding Path=PlacementTarget.Tag, RelativeSource={RelativeSource Self}}">
            <MenuItem Header="Select Highlighted Rows" Command="{Binding CheckSelectedCommand}"/>
        </ContextMenu>
    </DataGrid.ContextMenu>
</DataGrid>

MainWindow.xaml.cs:主窗口.xaml.cs:

public class MainWindowViewModel : BaseVM
{
    private ObservableCollection<OrdersModel> _orders;
    private RelayCommand _checkSelectedCommand;

    public MainWindowViewModel()
    {
        Initialize();
    }

    public ObservableCollection<OrdersModel> Orders
    {
        get
        {
            if (_orders == null)
                _orders = new ObservableCollection<OrdersModel>();
            return _orders;
        }
    }

    public RelayCommand CheckSelectedCommand
    {
        get
        {
            if (_checkSelectedCommand == null)
                _checkSelectedCommand = new RelayCommand(o => DoCheckSelectedRows());
            return _checkSelectedCommand;
        }
    }

    public void Initialize()
    {
        var dateTime = DateTime.Now.AddDays(-5);
        for (int i = 0; i < 10; i++)
        {
            this.Orders.Add(new OrdersModel() { OrderId = i, OrderDate = dateTime.AddHours(4), OrderNumber = $"CA{i + 1593:0000}" });
        }
    }

    private void DoCheckSelectedRows()
    {
        var selectedOrders = this.Orders.Where(o => o.Selected);
        foreach (var order in selectedOrders)
        {
            order.Checked = true;
        }
    }
}

Solution will look like this:解决方案将如下所示:

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何在SelectionMode为多个的情况下设置Listpicker项目 - how to set Listpicker items where SelectionMode is multiple 使用SelectionMode Multiple / Extended在多个嵌套ListBox中获取所有选定项 - Get all selected items across multiple nested ListBoxes with SelectionMode Multiple/Extended 如何在MVVM中绑定所选项目 - How to bind Selected Items in MVVM 当SelectionMode =“ Extended”时,DataGrid无法正确取消选择隐藏项 - DataGrid doesn't deselect hidden items properly when SelectionMode=“Extended” 如何在Windows 8.1中使用Behaviors SDK将ListView与SelectionMode多个绑定以实现MVVM - How to bind a ListView with SelectionMode multiple to achieve MVVM using Behaviors SDK in Windows 8.1 如何将数据绑定并填充/显示从ListBox选定项的DataGrid或UniformGrid(SelectionMode = Multiple) - How to bind data and fill/display to DataGrid or UniformGrid from ListBox selected items (SelectionMode=Multiple) 使用SelectionMode = Extended选择列表框 - Listbox IsSelected with SelectionMode=Extended 如何获得绑定到DataTable的DataGrid SelectionMode =“ Extended” SelectionUnit =“ Cell”的选择 - How to get selection of DataGrid SelectionMode=“Extended” SelectionUnit=“Cell” Binded to DataTable 使用SelectionMode =“ Multiple”和BindableSelection扩展绑定嵌套列表框中的选定项目 - Binding selected items in nested ListBox with SelectionMode=“Multiple” and BindableSelection extension 使用 MVVM 重置组合框选定的项目 - Reset combobox selected item on set using MVVM
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM