一个简单的Silverlight的DataBinding和DateTemplate的Demo
2012-04-28 10:59
351 查看
DataBinding和DateTemplate 都是Silverlight Wpf常用的UI技术。仿做一个简单的日程表Demo总结下。
该Demo主要通过DataBinding将TaskCollection相关Task显示在UI上,而显示的方式则通过DataTemplate来定制。
实现接口INotifyPropertyChanged
该接口负责当我们的数据,或者UI被修改后,负责发出Event消息来响应。
ViewModelBase.cs:
usingSystem.ComponentModel;
namespaceDataTemplateAndBinding
{
public classViewModelBase:INotifyPropertyChanged
{
public voidOnPropertyChanged(string propertyName)
{
if(PropertyChanged !=
null)
{
PropertyChanged(this,
new PropertyChangedEventArgs(propertyName));
}
}
public eventPropertyChangedEventHandler PropertyChanged;
}
}
建立一个我们要使用的类Task:
namespaceDataTemplateAndBinding
{
public classTask:ViewModelBase
{
public Task()
{
TaskName = "";
Priority = 0;
Description = "";
}
public Task(stringname,string desc,intprio)
{
TaskName = name;
Description = desc;
Priority = prio;
}
private stringtaskname;
public stringTaskName
{
get
{
returntaskname;
}
set
{
if(taskname !=
value)
{
taskname = value;
OnPropertyChanged("TaskName");
}
}
}
private stringdescription;
public stringDescription
{
get
{
returndescription;
}
set
{
if(description !=
value)
{
description = value;
OnPropertyChanged("Description");
}
}
}
private intpriority;
public intPriority
{
get{ return priority; }
set
{
priority = value;
OnPropertyChanged("Priority");
}
}
}
}
将上面的Task类封装成TaskCollection,即我们要显示在界面的类
usingSystem.Collections.ObjectModel;
namespaceDataTemplateAndBinding
{
public classTaskCollection
{
public ObservableCollection<Task> Tasks {
get;set; }
public TaskCollection()
: base()
{
Tasks = newObservableCollection<Task>();
Tasks.Add(newTask("Groceries","Pick up Groceries and Detergent",2));
Tasks.Add(newTask("Laundry","Do my Laundry", 2));
Tasks.Add(newTask("Email","Email clients", 1));
Tasks.Add(newTask("Clean","Clean my office", 3));
Tasks.Add(newTask("Dinner","Get ready for family reunion",1));
Tasks. Add(newTask("Proposals","Review new budget proposals",2));
}
}
}
最后是UI的代码:
在MainPage的XAML代码:
<UserControl x:Class="DataTemplateAndBinding.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:data="clr-namespace:DataTemplateAndBinding"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="700">
<UserControl.Resources>
<data:TaskCollection x:Key="myTodoLists"/>
//下面通过DataTemplate来定制我们显示我们自己数据的方式
<DataTemplate x:Key="MyTaskTemplate">
<Border Name="border" BorderBrush="Aqua"BorderThickness="1" Padding="5"
Margin="5" Width="700">
<Grid>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Row="0" Grid.Column="0"
Text="TaskName: "/>
<TextBlock Grid.Row="0" Grid.Column="1" Text="{Binding
Path=TaskName}"/>
<TextBlock Grid.Row="1" Grid.Column="0"
Text="Description: "/>
<TextBlock Grid.Row="1" Grid.Column="1"
Text="{Binding Path=Description}"/>
<TextBlock Grid.Row="2" Grid.Column="0"
Text="Priority: "/>
<TextBlock Grid.Row="2" Grid.Column="1"
Text="{Binding Path=Priority}"/>
</Grid>
</Border>
</DataTemplate>
</UserControl.Resources>
//将数据和DataTemplate等绑定到我们UI的ListBox上显示。
<StackPanelDataContext="{StaticResource
myTodoLists }" >
<TextBlock Name="todoLists" FontSize="20"
Text="MyTodo Lists"/>
<ListBox ItemsSource="{Binding
Path=Tasks}" ItemTemplate="{StaticResource MyTaskTemplate }"
/>
</StackPanel>
</UserControl>
该Demo主要通过DataBinding将TaskCollection相关Task显示在UI上,而显示的方式则通过DataTemplate来定制。
实现接口INotifyPropertyChanged
该接口负责当我们的数据,或者UI被修改后,负责发出Event消息来响应。
ViewModelBase.cs:
usingSystem.ComponentModel;
namespaceDataTemplateAndBinding
{
public classViewModelBase:INotifyPropertyChanged
{
public voidOnPropertyChanged(string propertyName)
{
if(PropertyChanged !=
null)
{
PropertyChanged(this,
new PropertyChangedEventArgs(propertyName));
}
}
public eventPropertyChangedEventHandler PropertyChanged;
}
}
建立一个我们要使用的类Task:
namespaceDataTemplateAndBinding
{
public classTask:ViewModelBase
{
public Task()
{
TaskName = "";
Priority = 0;
Description = "";
}
public Task(stringname,string desc,intprio)
{
TaskName = name;
Description = desc;
Priority = prio;
}
private stringtaskname;
public stringTaskName
{
get
{
returntaskname;
}
set
{
if(taskname !=
value)
{
taskname = value;
OnPropertyChanged("TaskName");
}
}
}
private stringdescription;
public stringDescription
{
get
{
returndescription;
}
set
{
if(description !=
value)
{
description = value;
OnPropertyChanged("Description");
}
}
}
private intpriority;
public intPriority
{
get{ return priority; }
set
{
priority = value;
OnPropertyChanged("Priority");
}
}
}
}
将上面的Task类封装成TaskCollection,即我们要显示在界面的类
usingSystem.Collections.ObjectModel;
namespaceDataTemplateAndBinding
{
public classTaskCollection
{
public ObservableCollection<Task> Tasks {
get;set; }
public TaskCollection()
: base()
{
Tasks = newObservableCollection<Task>();
Tasks.Add(newTask("Groceries","Pick up Groceries and Detergent",2));
Tasks.Add(newTask("Laundry","Do my Laundry", 2));
Tasks.Add(newTask("Email","Email clients", 1));
Tasks.Add(newTask("Clean","Clean my office", 3));
Tasks.Add(newTask("Dinner","Get ready for family reunion",1));
Tasks. Add(newTask("Proposals","Review new budget proposals",2));
}
}
}
最后是UI的代码:
在MainPage的XAML代码:
<UserControl x:Class="DataTemplateAndBinding.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:data="clr-namespace:DataTemplateAndBinding"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="700">
<UserControl.Resources>
<data:TaskCollection x:Key="myTodoLists"/>
//下面通过DataTemplate来定制我们显示我们自己数据的方式
<DataTemplate x:Key="MyTaskTemplate">
<Border Name="border" BorderBrush="Aqua"BorderThickness="1" Padding="5"
Margin="5" Width="700">
<Grid>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Row="0" Grid.Column="0"
Text="TaskName: "/>
<TextBlock Grid.Row="0" Grid.Column="1" Text="{Binding
Path=TaskName}"/>
<TextBlock Grid.Row="1" Grid.Column="0"
Text="Description: "/>
<TextBlock Grid.Row="1" Grid.Column="1"
Text="{Binding Path=Description}"/>
<TextBlock Grid.Row="2" Grid.Column="0"
Text="Priority: "/>
<TextBlock Grid.Row="2" Grid.Column="1"
Text="{Binding Path=Priority}"/>
</Grid>
</Border>
</DataTemplate>
</UserControl.Resources>
//将数据和DataTemplate等绑定到我们UI的ListBox上显示。
<StackPanelDataContext="{StaticResource
myTodoLists }" >
<TextBlock Name="todoLists" FontSize="20"
Text="MyTodo Lists"/>
<ListBox ItemsSource="{Binding
Path=Tasks}" ItemTemplate="{StaticResource MyTaskTemplate }"
/>
</StackPanel>
</UserControl>
相关文章推荐
- 一个简单的Silverlight的DataBinding和DateTemplate的Demo
- 一个Silverlight的可视化图的DataBinding的Demo
- 用silverlight2.0给微软DPE做的一个简单的demo,欢迎下载
- Silverlight学习(一) 创建Silverlight项目,构建一个简单的Silverlight Demo
- 一个Silverlight的可视化图的DataBinding的Demo
- Silverlight制作一个简单的菜单1-用到的知识讲解 xml数据读取,事件如何传递参数
- [置顶] 【Android】时间选择器,选择日期DatePicker 简单详解demo及教程
- Silverlight的一个简单加载标志Loading...
- 使用Antlr+Stringtemplate生成method chaining,一个不太简单的案例(6)
- 一个简单的TCP通信程序Demo
- Dubbo入门---搭建一个最简单的Demo框架
- [转]A Simple jQuery Tabs Template一个简单的选项卡
- Spring Boot应用连接数据库MySQL、及一个简单的demo
- 无废话WCF入门教程六[一个简单的Demo]
- 一个简单的方式去掉Date里的时间和…
- 一个简单的通过代码请求k8s生成应用的demo
- 无废话WCF入门教程六[一个简单的Demo]
- 一个简单的选项卡的demo
- 用Kotlin语言写一个简单的Android Demo(有详细步骤和各种解决方法)
- 今天在使用iscroll4 做一个简单触屏滚动demo,发现上下拖动的时候总是会回弹,不能看到下面的内容.这个问题苦恼了很久,终于解决