MvvM datagrid多行选中绑定

本文介绍了一种在MVVM模式下实现WPF DataGrid多选功能的方法,通过自定义DataGrid控件并添加依赖属性来同步选定项,确保View与ViewModel之间的双向绑定,适用于需要在WPF应用中进行复杂数据操作的场景。

来自:https://stackoverflow.com/questions/22868445/select-multiple-items-from-a-datagrid-in-an-mvvm-wpf-project#

You can simply add a custom dependency property to do this:

public class CustomDataGrid : DataGrid
{
    public CustomDataGrid ()
    {
        this.SelectionChanged += CustomDataGrid_SelectionChanged;
    }

    void CustomDataGrid_SelectionChanged (object sender, SelectionChangedEventArgs e)
    {
        this.SelectedItemsList = this.SelectedItems;
    }
    #region SelectedItemsList

    public IList SelectedItemsList
    {
        get { return (IList)GetValue (SelectedItemsListProperty); }
        set { SetValue (SelectedItemsListProperty, value); }
    }

    public static readonly DependencyProperty SelectedItemsListProperty =
            DependencyProperty.Register ("SelectedItemsList", typeof (IList), typeof (CustomDataGrid), new PropertyMetadata (null));

    #endregion
}

Now you can use this dataGrid in the XAML:

<Window x:Class="DataGridTesting.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
    xmlns:local="clr-namespace:DataGridTesting.CustomDatagrid"
    Title="MainWindow"
    Height="350"
    Width="525">
  <DockPanel>
    <local:CustomDataGrid ItemsSource="{Binding Model}"
        SelectionMode="Extended"
        AlternatingRowBackground="Aquamarine"
        SelectionUnit="FullRow"
        IsReadOnly="True"
        SnapsToDevicePixels="True"
        SelectedItemsList="{Binding TestSelected, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
  </DockPanel>
</Window>

My ViewModel:

public class MyViewModel : INotifyPropertyChanged
{
    private static object _lock = new object ();
    private List<MyModel> _myModel;

    public IEnumerable<MyModel> Model { get { return _myModel; } }

    private IList _selectedModels = new ArrayList ();

    public IList TestSelected
    {
        get { return _selectedModels; }
        set
        {
            _selectedModels = value;
            RaisePropertyChanged ("TestSelected");
        }
    }

    public MyViewModel ()
    {
        _myModel = new List<MyModel> ();
        BindingOperations.EnableCollectionSynchronization (_myModel, _lock);

        for (int i = 0; i < 10; i++)
        {
            _myModel.Add (new MyModel
            {
                Name = "Test " + i,
                Age = i * 22
            });
        }
        RaisePropertyChanged ("Model");
    }

    public event PropertyChangedEventHandler PropertyChanged;

    public void RaisePropertyChanged (string propertyName)
    {
        var pc = PropertyChanged;
        if (pc != null)
            pc (this, new PropertyChangedEventArgs (propertyName));
    }
}

My model:

public class MyModel
{
    public string Name { get; set; }
    public int Age { get; set; }
}

And finally, here is the code behind of MainWindow:

public partial class MainWindow : Window
{
    public MainWindow ()
    {
        InitializeComponent ();
        this.DataContext = new MyViewModel ();
    }
}

I hope this clean MVVM design helps.


DataGrid 多选在不同的开发环境和框架中有不同的实现方法,以下分别介绍常见的两种情况: ### ASP.NET 中 DataGrid 多选实现 在 ASP.NET 中可以通过如下方式实现 DataGrid 的多选功能。示例代码如下: ```html <h3>DataGrid Selection Example</h3> <asp:DataGrid id="MyDataGrid" runat="server" BorderColor="black" BorderWidth="1" CellPadding="3" Font-Name="Verdana" Font-Size="8pt" OnSelectedIndexChanged="MyDataGrid_Select" AutoGenerateColumns="false"></asp:DataGrid> ``` 这里创建了一个 `DataGrid` 控件,`AutoGenerateColumns` 设置为 `false` 表示不自动生成列,需要手动义列。`OnSelectedIndexChanged` 事件可用于处理选中项改变的逻辑。 ### WPF MVVM 模式下 DataGrid选中 在 WPF 的 MVVM 项目中实现 DataGrid选中可参考 Stack Overflow 上的相关内容。通常步骤如下: 1. 在 XAML 中设置 `DataGrid` 的 `SelectionMode` 为 `Extended` 以支持多选: ```xml <DataGrid ItemsSource="{Binding YourItems}" SelectionMode="Extended" SelectedItems="{Binding SelectedItems, Mode=TwoWay}"/> ``` 2. 在 ViewModel 中义 `SelectedItems` 属性: ```csharp private ObservableCollection<YourItemType> _selectedItems; public ObservableCollection<YourItemType> SelectedItems { get { return _selectedItems; } set { _selectedItems = value; OnPropertyChanged(nameof(SelectedItems)); } } ``` 使用指南: - 在 ASP.NET 中,需要在服务器端代码中处理 `OnSelectedIndexChanged` 事件,根据选中的索引获取相应的数据进操作。 - 在 WPF MVVM 中,当 `DataGrid` 中的选中项发生变化时,`ViewModel` 中的 `SelectedItems` 属性会自动更新,可在 `ViewModel` 中对这些选中项进业务逻辑处理。
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值