您的位置:首页 > 其它

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的定义

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

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐