做過WinForm數據庫開發的人,一定有類似經歷:DataGrid綁定後,如果允許行編輯,數據一頓修改後,想批量保存修改後的結果,通常是將DataGrid的所有行遍歷,用FindControl找出其中的TextBox之類的控件,取值,然後處理,如果行模板中的控件變化了,可能之前的處理代碼又要修改...
.Net發展到WPF/SL時代,有了雙向綁定,這種痛苦經歷已經一去不返了,我們只需要關注數據即可,GridView與數據源之間會相互通知各自的變化情況,批量保存時,不管GridView中的數據用戶如何修改,也不用去理會行模板中的控件名是啥,直接對數據源進行處理即可。
Xaml示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
< UserControl
xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation" x:Class="SLShortCut.MainPage" mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="400"> < StackPanel
x:Name="LayoutRoot" Background="White"> < telerik:RadGridView
ShowGroupPanel="False" AutoGenerateColumns="False" x:Name="grd1" ItemsSource="{Binding Path=LstData, Mode=TwoWay}" SelectionMode="Extended"> < telerik:RadGridView.Columns > < telerik:GridViewSelectColumn
/> < telerik:GridViewColumn
Header="姓名"> < telerik:GridViewColumn.CellTemplate > < DataTemplate > < TextBox
x:Name="txtName" Text="{Binding Name,Mode=TwoWay}" VerticalAlignment="Center" Height="22"></ TextBox > </ DataTemplate > </ telerik:GridViewColumn.CellTemplate > </ telerik:GridViewColumn > < telerik:GridViewColumn
Header="年齡"> < telerik:GridViewColumn.CellTemplate > < DataTemplate > < TextBox
x:Name="txtAge" Text="{Binding Age,Mode=TwoWay}" VerticalAlignment="Center" Height="22"></ TextBox > </ DataTemplate > </ telerik:GridViewColumn.CellTemplate > </ telerik:GridViewColumn > < telerik:GridViewColumn
Header="操作"> < telerik:GridViewColumn.CellTemplate > < DataTemplate > < StackPanel
Orientation="Horizontal"> < telerik:RadButton
Content="+" Width="20" Height="20" VerticalAlignment="Center" x:Name="btnAdd" Click="btnAdd_Click"/> < telerik:RadButton
Content="-" Margin="5,0,0,0" Width="20" Height="20" VerticalAlignment="Center" x:Name="btnSub" Click="btnSub_Click"/> </ StackPanel > </ DataTemplate > </ telerik:GridViewColumn.CellTemplate > </ telerik:GridViewColumn > </ telerik:RadGridView.Columns > </ telerik:RadGridView > < telerik:RadButton
Height="22" Width="100" Margin="0,10,0,0" x:Name="btnSave" Click="btnSave_Click">全部保存</ telerik:RadButton > </ StackPanel > </ UserControl > |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
|
using
System.Collections.ObjectModel; using
System.ComponentModel; using
System.Windows; using
System.Windows.Controls; using
Telerik.Windows.Controls; namespace
SLShortCut { public
partial class
MainPage : UserControl { PersonCollection pc =
new PersonCollection(); public
MainPage() { InitializeComponent(); this .Loaded +=
new RoutedEventHandler(MainPage_Loaded); } void
MainPage_Loaded( object
sender, RoutedEventArgs e) { pc.LstData.Add( new
Person() { Name = "張三" , Age = 1 }); pc.LstData.Add( new
Person() { Name = "李四" , Age = 2 }); this .DataContext = pc; } private
void btnAdd_Click( object
sender, RoutedEventArgs e) { pc.LstData.Add( new
Person() { }); } private
void btnSub_Click( object
sender, RoutedEventArgs e) { var
p = (sender as
RadButton).DataContext as
Person; pc.LstData.Remove(p); } private
void btnSave_Click( object
sender, RoutedEventArgs e) { foreach
( var
item in this .pc.LstData) { MessageBox.Show( string .Format( "Name:{0},Age:{1}" ,
item.Name, item.Age)); } } } public
class PersonCollection
{ private
ObservableCollection<Person> lstData = new
ObservableCollection<Person>(); public
ObservableCollection<Person> LstData { get
{ return
lstData; } set
{ lstData = value; } } } public
class Person : INotifyPropertyChanged { public
event PropertyChangedEventHandler PropertyChanged; private
string _name =
"" ; public
string Name { get
{ return
_name; } set { _name = value; if
(PropertyChanged != null ) { PropertyChanged( this ,
new PropertyChangedEventArgs( "Name" )); } } } private
int _age = 0; public
int Age { get
{ return
_age; } set { _age = value; if
(PropertyChanged != null ) { PropertyChanged( this ,
new PropertyChangedEventArgs( "Age" )); } } } } } |
出處:http://yjmyzz.cnblogs.com
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。