Mvvm绑定datagrid或listview的selectItems的方法[转]

单选,很简单,将SelectedItem与ViewModel的属性进行双向绑定就OK了

多选,由于ListView的SelectedItems不能进行绑定,需要将ListView的SelectionChanged事件转换成命令绑定到ViewModel,同时将SelectedItems传递到ViewModel层

示例:
首先添加程序集引用System.Windows.Interactivity.dll

xaml
添加命名空间引用

HTML code

<UserControl ...
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
/>
HTML code

<ListView ItemsSource="{Binding Source={StaticResource CustomerGroups}}"
x:Name="dataGrid1" >
<ListView.GroupStyle>
<StaticResourceExtension ResourceKey="CustomerGroupStyle" />
</ListView.GroupStyle>
<ListView.View>
<GridView>
<GridView.Columns>
<GridViewColumn DisplayMemberBinding="{Binding DisplayName,Mode=OneWay}" Header="Name" />
<GridViewColumn DisplayMemberBinding="{Binding Email,Mode=OneWay}" Header="E-Mail" />
<GridViewColumn DisplayMemberBinding="{Binding TotalSales,Mode=OneWay, ConverterCulture=zh-CN, StringFormat=c}" Header="Total Sales" />
</GridView.Columns>
</GridView>
</ListView.View>
<i:Interaction.Triggers>
<i:EventTrigger EventName="SelectionChanged">
<i:InvokeCommandAction Command="{Binding SelectionChangeCommand}" CommandParameter="{Binding SelectedItems,ElementName=dataGrid1}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</ListView>

viewmodel:

C# code
        public RelayCommand<IList> SelectionChangeCommand
        {
            get
            {
                return new RelayCommand<IList>
                    (
                        (selectedItems) =>
                        {
                            TotalSelectedSales = 0;

                            CustomerViewModel firstCustomer = null;

                            if (selectedItems.Count > 0)
                                firstCustomer = selectedItems[0] as CustomerViewModel;

                            // 将选中第一条CustomerViewModel传递到主页面
                            selectedCustomer = firstCustomer;

                            // 更新按钮的可执行状态
                            EditCustomerCommand.RaiseCanExecuteChanged();
                            DeleteCustomerCommand.RaiseCanExecuteChanged();

                            foreach (dynamic Item in selectedItems)
                                TotalSelectedSales += Item.TotalSales;

                            RaisePropertyChanged("TotalSelectedSales");
                        }
                    );
            }
        }
时间: 2024-08-28 08:36:38

Mvvm绑定datagrid或listview的selectItems的方法[转]的相关文章

WPF DataGrid、ListView 简单绑定

DataGrid运行效果: xaml 代码: DataGridName= dtgData ItemsSource= {Binding} AutoGenerateColumns= False DataGrid.Columns DataGridTextColumnBinding= {BindingPath=id} Header= ID HeaderStringFormat= id / DataGridTextColumnBinding= {BindingPath=name} Header= 名称 H

“Win10 UAP 开发系列”之 在MVVM模式中控制ListView滚动位置

这个扩展属性从WP8.1就开始用了,主要是为了解决MVVM模式中无法直接控制ListView滚动位置的问题.比如在VM中刷新了数据,需要将View中的ListView滚动到顶部,ListView只有一个ScrollIntoView()方法可以控制滚动的位置,但最好在VM中不要出现直接控制View的代码,需要通过其他的方式. 使用一个扩展属性即可实现: /// <summary> /// 将ListView滚动到顶部 使用方法:在ListView增加扩展属性 /// ext:ListViewSc

.NET CORE(C#) WPF简单菜单MVVM绑定

原文:.NET CORE(C#) WPF简单菜单MVVM绑定 微信公众号:Dotnet9,网站:Dotnet9,问题或建议:请网站留言, 如果对您有所帮助:欢迎赞赏. .NET CORE(C#) WPF简单菜单MVVM绑定 阅读导航 本文背景 代码实现 本文参考 源码 1. 本文背景 WPF中垂直导航菜单大家应该都常用,本文介绍使用MVVM的方式怎么绑定菜单,真的很简单. 2. 代码实现 使用 .Net Core 3.1 创建名为 "MenuMVVM" 的WPF模板项目,添加两个Nug

当写listview的onItemClick的方法时写Toast的参数context写成this出现can&#39;t resolve method ’make text(OnClickListener,java.lang.String,int)&#39;的错误,原因

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Fruit fruit = fruitList.get(position); //Toast.makeText(this,fruit.getName(),Toast.L

关于DataGrid 多选耗时的解决方法

一般情况,对于DataGrid需要多选其中多项时,遍历这些项使用DataGrid.SelectedItems.Add(item)即可,但当需要多选的项目很多时,比如几千条,几万条,这样的操作却是相当耗时的,因为每次Add操作都会引起实现的界面刷新操作,查看DataGrid源码,看到DataGrid提供了更新前后的方法,即BeginUpdateSelectedItems与EndUpdateSelectedItems,相关的测试代码如下: var dttype = typeof (DataGrid)

ListView单条刷新的方法

我们一般会调用notifydatasetchange通知listView刷新界面.但会造成getView方法被多次调用(画面上能显示多少就会被调用多少次),如果是很明确的知道只更新了list中的某一个项的数据,应该尽量避免getView被无辜的多次调用.我们希望的是对屏幕上已经显示的item进行针对性刷新,那么我们就必须得到屏幕上第一个item和最后一个item的位置,之后手动调用adapter的getView()方法. 下面是google给出的listview单条刷新的方法: private

ListView的getChildAt(i)方法

ListView的getChildAt(i)方法只能获取显示在屏幕上的内容,其中i参数为列表子项在可视范围内的第几项. 若是超出显示范围外,则会返回空指针. listView.getLastVisiblePosition()和 listView.getFirstVisiblePosition()可用来返回当前列表显示在屏幕上 的子项的第一列和最后一列在整个列表中的位置. 使用下面语句可以返回当前屏幕总共显示的子项数目: int count = listView.getLastVisiblePos

android 修改listview item view 的方法(转)

android 修改listview item view 的方法 具体的解答办法很简单: 代码如下 : 1.获取需要更新的view int visiblePosition = mListView.getFirstVisiblePosition(); View view = mListView.getChildAt(position - visiblePosition); mListView.getAdapter().getView(position, view, mListView); 2.通过

在XAML中为ItemsControl定义分组,适合mvvm绑定

可以先参考一下这个文章: http://www.cnblogs.com/zoexia/archive/2014/11/30/4134012.html step0: 先展示一下最简陋的界面: 上图是一个控件容器:ListBox,每一项都是一个Student的学生数据,它继承自ItemsControl,所以是可以实现分组的.容器内每个组用Expander可伸缩控件表示.请保证已经完全理解图中所有控件和数据的含义,然后再进行下一步. step1: 首先,我们从dataContext数据源入手,因为它是