WPF绑定SelectedItems在MVVM [英] WPF Binding SelectedItems in MVVM

查看:1844
本文介绍了WPF绑定SelectedItems在MVVM的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要选择使用MVVM从DataGrid的多个项目。

I need to select Multiple items from datagrid using MVVM.

推荐答案

您可以简单地添加自定义依赖属性做到这一点。

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
}

现在你可以在XAML中使用此数据网格

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>

我的视图模型

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

最后我的模型

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

下面是主窗口

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

我希望这干净的MVVM的设计有助于

I hope this clean MVVM design helps

这篇关于WPF绑定SelectedItems在MVVM的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆