MVVM:如何给一个列表绑定数据
2012-04-09 19:15
351 查看
使用MVVM的方式给一个gridview绑定数据源
是telerik控件
1.定义的实体DocRegister
ObservableCollection<DocRegister> _dataSouce;
2.定义实体的属性
public ObservableCollection<DocRegister> DataSouce
{
get { return _dataSouce; }
set
{
if (!ReferenceEquals(_dataSouce, value))
{
_dataSouce = value;
this.RaisePropertyChanged(() => this.DataSouce);
}
}
}
3.记得当前类继承自NotificationObject
4.所有的命名空间:
using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Microsoft.Practices.Prism.ViewModel;
using System.Collections.ObjectModel;
using Microsoft.Practices.Prism.Commands;
5.构造函数的时候用WCF从服务器端把数据那过来
public DocRegisterNavigateViewModel()
{
client = InnerHelper.CreateDocRegisterManageServiceClient();
client.GetDocRegisterListCompleted += new EventHandler<GetDocRegisterListCompletedEventArgs>(client_GetDocRegisterListCompleted);
//在什么时候调用WCF,很有用的
client.GetDocRegisterListAsync("", "");
}
void client_GetDocRegisterListCompleted(object sender, GetDocRegisterListCompletedEventArgs e)
{
if (e.Error == null)
{
//返回结果
DataSouce = e.Result;
}
else
{
Glodon.Component.Controls.DialogHelper.AlertDialog("获取数据失败!", "提示");
}
}
6.点击页面的查看注册的事件
private ICommand _lookCommand;
public ICommand LookCommand
{
get { return _lookCommand ?? (_lookCommand = new DelegateCommand<object>(this.OnLookCommand)); }
}
7.当点击”查看“每行连接的时候把值传过去(创建一个新的页面,并且把当前选择的行值传过去)
private void OnLookCommand(object obj)
{
if (CurrentItem != null)
{
AddDOCRegister editWindow = new AddDOCRegister(CurrentItem);
editWindow.Show();
}
}
8.XAML文件:注意Command的使用
<TR:RadGridView HorizontalAlignment="Left" Name="radGridView" VerticalAlignment="Top" ItemsSource="{Binding DataSouce,Mode=TwoWay}" SelectedItem="{Binding CurrentItem,Mode=TwoWay}"
AutoGenerateColumns="False" ShowGroupPanel="False" Grid.Row="1">
<TR:RadGridView.Columns>
<TR:GridViewColumn Header="查看" Width="60" HeaderTextAlignment="Center">
<TR:GridViewColumn.CellTemplate>
<DataTemplate>
<HyperlinkButton Name="ViewButton" Tag="{Binding DocRegisterAdministrativeId}" Content="查看" Command="{Binding Source={StaticResource DataContextProxy},Path=DataSource.LookCommand}" CommandParameter="{Binding ElementName=ViewButton}"/>
</DataTemplate>
</TR:GridViewColumn.CellTemplate>
</TR:GridViewColumn>
<TR:GridViewDataColumn IsReadOnly="True" Header="序号" IsFilterable="False" Width="60" TextAlignment="Center" HeaderTextAlignment="Center" />
<TR:GridViewDataColumn IsReadOnly="True" DataMemberBinding="{Binding ReceiptDate,Mode=OneWay}" Header="收文日期" IsFilterable="False" Width="150" HeaderTextAlignment="Center" />
<TR:GridViewDataColumn IsReadOnly="True" DataMemberBinding="{Binding DNumber,Mode=OneWay}" Header="来文字号" IsFilterable="False" Width="120" HeaderTextAlignment="Center" />
<TR:GridViewDataColumn IsReadOnly="True" DataMemberBinding="{Binding DFrom,Mode=OneWay}" Header="来文机关" IsFilterable="False" Width="*" HeaderTextAlignment="Center" />
<TR:GridViewDataColumn IsReadOnly="True" DataMemberBinding="{Binding DTitle,Mode=OneWay}" Header="文件标题" IsFilterable="False" Width="*" HeaderTextAlignment="Center" />
<TR:GridViewDataColumn IsReadOnly="True" DataMemberBinding="{Binding DConfidentialityId,Mode=OneWay}" Header="机密程度" IsFilterable="False" Width="60" HeaderTextAlignment="Center" />
<TR:GridViewDataColumn IsReadOnly="True" DataMemberBinding="{Binding FileCount,Mode=OneWay}" Header="正文份数" IsFilterable="False" Width="60" HeaderTextAlignment="Center" />
<TR:GridViewDataColumn IsReadOnly="True" DataMemberBinding="{Binding AttachmentCount,Mode=OneWay}" Header="附件份数" IsFilterable="False" Width="60" HeaderTextAlignment="Center" />
<TR:GridViewDataColumn IsReadOnly="True" DataMemberBinding="{Binding DState,Mode=OneWay}" Header="状态" IsFilterable="False" Width="80" HeaderTextAlignment="Center" />
</TR:RadGridView.Columns>
</TR:RadGridView>
(1)DataContextProxy在页面开始时有这样一行代码,把。CS文件引入过来,这样在当前XAML文件下面可以使用
<UserControl.Resources>
<helper:DataContextProxy x:Key="DataContextProxy" />
</UserControl.Resources>
DataContextProxy的定义
9.最主要的一步,把viewmodel与页面绑定在一起的
在XAML页面的初始化的时候,给xaml当前的上下文DataContext 指定一个viewmodel:DocRegisterNavigateViewModel
public partial class DocRegisterNavigateView : UserControl
{
public DocRegisterNavigateView()
{
InitializeComponent();
this.DataContext = new DocRegisterNavigateViewModel();
}
}
是telerik控件
1.定义的实体DocRegister
ObservableCollection<DocRegister> _dataSouce;
2.定义实体的属性
public ObservableCollection<DocRegister> DataSouce
{
get { return _dataSouce; }
set
{
if (!ReferenceEquals(_dataSouce, value))
{
_dataSouce = value;
this.RaisePropertyChanged(() => this.DataSouce);
}
}
}
3.记得当前类继承自NotificationObject
4.所有的命名空间:
using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Microsoft.Practices.Prism.ViewModel;
using System.Collections.ObjectModel;
using Microsoft.Practices.Prism.Commands;
5.构造函数的时候用WCF从服务器端把数据那过来
public DocRegisterNavigateViewModel()
{
client = InnerHelper.CreateDocRegisterManageServiceClient();
client.GetDocRegisterListCompleted += new EventHandler<GetDocRegisterListCompletedEventArgs>(client_GetDocRegisterListCompleted);
//在什么时候调用WCF,很有用的
client.GetDocRegisterListAsync("", "");
}
void client_GetDocRegisterListCompleted(object sender, GetDocRegisterListCompletedEventArgs e)
{
if (e.Error == null)
{
//返回结果
DataSouce = e.Result;
}
else
{
Glodon.Component.Controls.DialogHelper.AlertDialog("获取数据失败!", "提示");
}
}
6.点击页面的查看注册的事件
private ICommand _lookCommand;
public ICommand LookCommand
{
get { return _lookCommand ?? (_lookCommand = new DelegateCommand<object>(this.OnLookCommand)); }
}
7.当点击”查看“每行连接的时候把值传过去(创建一个新的页面,并且把当前选择的行值传过去)
private void OnLookCommand(object obj)
{
if (CurrentItem != null)
{
AddDOCRegister editWindow = new AddDOCRegister(CurrentItem);
editWindow.Show();
}
}
8.XAML文件:注意Command的使用
<TR:RadGridView HorizontalAlignment="Left" Name="radGridView" VerticalAlignment="Top" ItemsSource="{Binding DataSouce,Mode=TwoWay}" SelectedItem="{Binding CurrentItem,Mode=TwoWay}"
AutoGenerateColumns="False" ShowGroupPanel="False" Grid.Row="1">
<TR:RadGridView.Columns>
<TR:GridViewColumn Header="查看" Width="60" HeaderTextAlignment="Center">
<TR:GridViewColumn.CellTemplate>
<DataTemplate>
<HyperlinkButton Name="ViewButton" Tag="{Binding DocRegisterAdministrativeId}" Content="查看" Command="{Binding Source={StaticResource DataContextProxy},Path=DataSource.LookCommand}" CommandParameter="{Binding ElementName=ViewButton}"/>
</DataTemplate>
</TR:GridViewColumn.CellTemplate>
</TR:GridViewColumn>
<TR:GridViewDataColumn IsReadOnly="True" Header="序号" IsFilterable="False" Width="60" TextAlignment="Center" HeaderTextAlignment="Center" />
<TR:GridViewDataColumn IsReadOnly="True" DataMemberBinding="{Binding ReceiptDate,Mode=OneWay}" Header="收文日期" IsFilterable="False" Width="150" HeaderTextAlignment="Center" />
<TR:GridViewDataColumn IsReadOnly="True" DataMemberBinding="{Binding DNumber,Mode=OneWay}" Header="来文字号" IsFilterable="False" Width="120" HeaderTextAlignment="Center" />
<TR:GridViewDataColumn IsReadOnly="True" DataMemberBinding="{Binding DFrom,Mode=OneWay}" Header="来文机关" IsFilterable="False" Width="*" HeaderTextAlignment="Center" />
<TR:GridViewDataColumn IsReadOnly="True" DataMemberBinding="{Binding DTitle,Mode=OneWay}" Header="文件标题" IsFilterable="False" Width="*" HeaderTextAlignment="Center" />
<TR:GridViewDataColumn IsReadOnly="True" DataMemberBinding="{Binding DConfidentialityId,Mode=OneWay}" Header="机密程度" IsFilterable="False" Width="60" HeaderTextAlignment="Center" />
<TR:GridViewDataColumn IsReadOnly="True" DataMemberBinding="{Binding FileCount,Mode=OneWay}" Header="正文份数" IsFilterable="False" Width="60" HeaderTextAlignment="Center" />
<TR:GridViewDataColumn IsReadOnly="True" DataMemberBinding="{Binding AttachmentCount,Mode=OneWay}" Header="附件份数" IsFilterable="False" Width="60" HeaderTextAlignment="Center" />
<TR:GridViewDataColumn IsReadOnly="True" DataMemberBinding="{Binding DState,Mode=OneWay}" Header="状态" IsFilterable="False" Width="80" HeaderTextAlignment="Center" />
</TR:RadGridView.Columns>
</TR:RadGridView>
(1)DataContextProxy在页面开始时有这样一行代码,把。CS文件引入过来,这样在当前XAML文件下面可以使用
<UserControl.Resources>
<helper:DataContextProxy x:Key="DataContextProxy" />
</UserControl.Resources>
DataContextProxy的定义
using System; using System.Net; using System.Windows; using System.Windows.Controls; using System.Windows.Documents; using System.Windows.Ink; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Animation; using System.Windows.Shapes; using System.Windows.Data; namespace Glodon.Module.DocRegisterManage.Help { public class DataContextProxy : FrameworkElement { public DataContextProxy() { this.Loaded += new RoutedEventHandler(DataContextProxy_Loaded); } void DataContextProxy_Loaded(object sender, RoutedEventArgs e) { Binding binding = new Binding(); if (!String.IsNullOrEmpty(BindingPropertyName)) { binding.Path = new PropertyPath(BindingPropertyName); } binding.Source = this.DataContext; binding.Mode = BindingMode; this.SetBinding(DataContextProxy.DataSourceProperty, binding); } public Object DataSource { get { return (Object)GetValue(DataSourceProperty); } set { SetValue(DataSourceProperty, value); } } public static readonly DependencyProperty DataSourceProperty = DependencyProperty.Register("DataSource", typeof(Object), typeof(DataContextProxy), null); public string BindingPropertyName { get; set; } public BindingMode BindingMode { get; set; } } }
9.最主要的一步,把viewmodel与页面绑定在一起的
在XAML页面的初始化的时候,给xaml当前的上下文DataContext 指定一个viewmodel:DocRegisterNavigateViewModel
public partial class DocRegisterNavigateView : UserControl
{
public DocRegisterNavigateView()
{
InitializeComponent();
this.DataContext = new DocRegisterNavigateViewModel();
}
}
相关文章推荐
- 用vue,如何给一个列表中的每个元素标签绑定id
- 利用 JavaScript 数据绑定实现一个简单的 MVVM 库
- C# 程序中如何向(DEV)ComboBoxEdit控件中添加下拉列表的值不使用数据绑定,就是使用代码添加
- JavaScript数据绑定实现一个简单的 MVVM 库
- 使用Vue如何写一个双向数据绑定(面试常见)
- 终于解决了一个问题--如何在数据绑定时不让combox控件触发SelectedIndexChanged事件
- Visual Basic 2005——如何绑定到一个IEnumerable数据来源
- js mvvm:闲来无事,实现一个只具最基本数据双向绑定的mvvm
- JavaScript数据绑定实现一个简单的 MVVM 库
- Visual Basic 2005——如何绑定到一个IEnumerable数据来源
- 如何为winform中的列表控件Combobox、ListBox控件绑定数据
- Xaml中如何对ComboBox绑定一个数据集合
- 终于解决了一个问题--如何在数据绑定时不让combox控件触发SelectedIndexChanged事件
- VB.Net自己写的一个控件:ComboBox下拉列表中显示多列数据(可以绑定数据表)
- sharepoint 2013 如何创建一个webservice获取sharepoint列表数据
- winform有一个combobox和一个textbox控件,如何进行动态绑定,使得combobox中的数据改变时,textbox中的数据也随之改变?
- vue动态数据绑定1--如何监听一个对象的变化
- 如何去绑定一个树形数据
- RoboBinding:一个实现了数据绑定 Presentation Model(MVVM) 模式的Android开源框架
- 如何用C#和ADO.NET建立一个数据绑定网格