Giới thiệu
WPF cung cấp một cách đơn giản và mạnh mẽ để tự động cập nhật dữ liệu giữa các business model và người sử dụng giao diện. Cơ chế này được gọi là DataBinding. Mỗi khi dữ liệu thay đổi business model của bạn, nó sẽ tự động phản ánh sự cập nhật giao diện người dùng và ngược lại. Đây là phương pháp ưa thích trong WPF để đưa dữ liệu đến giao diện người dùng.
Databinding có thể được unidirectional (source -> target or target <- source), hoặc bidirectional (source <-> target)
Source của databinding có thể là một thuộc tính .NET bình thường hoặc một thuộc tính phụ thuộc. Các thuộc tính target của sự ràng buộc phải là một thuộc tính phụ thuộc.
Để thực hiện các công việc databinding, cả hai mặt của một ràng buộc phải cung cấp một thông báo thay đổi mà nói với các ràng buộc khi để cập nhật các giá trị mục tiêu.. Trên thuộc tính .NET bình thường được thực hiện bằng cách tăng sự kiện PropertyChanged của INotifyPropertyChanged interface. On DependencyProperties it is done by the PropertyChanged callback of the property metadata Ngày DependencyProperties nó được thực hiện bởi các cuộc gọi lại PropertyChanged của thuộc tính siêu dữ liệu.
Databinding thường được thực hiện trong XAML bằng cách sử dụng {Binding} mở rộng đánh dấu. Ví dụ sau đây cho thấy một liên kết đơn giản giữa các văn bản của một TextBox và một Label phản ánh giá trị nhập:
<StackPanel>
<TextBox x:Name="txtInput" />
<Label Content="{Binding Text, ElementName=txtInput,
UpdateSourceTrigger=PropertyChanged}" />
</StackPanel>
<TextBox x:Name="txtInput" />
<Label Content="{Binding Text, ElementName=txtInput,
UpdateSourceTrigger=PropertyChanged}" />
</StackPanel>
DataContext
kiểm soát WPF bắt nguồn từ FrameworkElement có một thuộc tính DataContext. Thuộc tính này có nghĩa là để được thiết lập các dữ liệu đối tượng nó hình dung. bạn không explicity xác định là nguồn gốc của một ràng buộc, nó có bối cảnh dữ liệu theo mặc định.
Các thuộc tính DataContext thừa kế giá trị của nó đến các phần tử con. Vì vậy, bạn có thể đặt DataContext trên một container bố trí cao cấp và giá trị của nó được kế thừa để tất cả các phần tử con. Điều này là rất hữu ích nếu bạn muốn xây dựng một hình thức liên kết với nhiều thuộc tính của đối tượng cùng một dữ liệu.
<StackPanel DataContext="{StaticResource myCustomer}">
<TextBox Text="{Binding FirstName}"/>
<TextBox Text="{Binding LastName}"/>
<TextBox Text="{Binding Street}"/>
<TextBox Text="{Binding City}"/>
</StackPanel>
<TextBox Text="{Binding FirstName}"/>
<TextBox Text="{Binding LastName}"/>
<TextBox Text="{Binding Street}"/>
<TextBox Text="{Binding City}"/>
</StackPanel>
ValueConverters
Nếu bạn muốn ràng buộc hai thuộc tính của các loại khác nhau với nhau, bạn cần sử dụng một ValueConverter. ValueConverter chuyển đổi giá trị từ một loại nguồn cho một loại mục tiêu và ngược lại. WPF đã bao gồm một số chuyển đổi giá trị nhưng trong hầu hết trường hợp, bạn sẽ cần phải viết riêng của bạn bằng cách thực hiện các giao diện IValueConverter.
Một ví dụ điển hình là để ràng buộc một thành viên boolean để các thuộc tính Visibility. Từ tầm nhìn này là một giá trị enum, có thể được Visible , Collapsed hoặc Hidden , bạn cần một công cụ chuyển đổi giá trị.
<StackPanel>
<StackPanel.Resources>
<BooleanToVisibilityConverter x:Key="boolToVis" />
</StackPanel.Resources><CheckBox x:Name="chkShowDetails"Content="Show Details" />
<StackPanel x:Name="detailsPanel"Visibility="{Binding IsChecked, ElementName=chkShowDetails, Converter={StaticResource boolToVis}}">
</StackPanel>
</StackPanel>
<StackPanel.Resources>
<BooleanToVisibilityConverter x:Key="boolToVis" />
</StackPanel.Resources><CheckBox x:Name="chkShowDetails"Content="Show Details" />
<StackPanel x:Name="detailsPanel"Visibility="{Binding IsChecked, ElementName=chkShowDetails, Converter={StaticResource boolToVis}}">
</StackPanel>
</StackPanel>
Ví dụ sau đây cho thấy một công cụ chuyển đổi đơn giản là chuyển đổi một boolen đến một sở hữu khả năng hiển thị. Lưu ý rằng như vậy là đã chuyển đổi một phần trong khuôn khổ NET..
public class BooleanToVisibilityConverter : IValueConverter {
public object Convert(object value, Type targetType, object parameter, CultureInfo culture) {
if (value is Boolean) {
return ((bool)value) ? Visibility.Visible : Visibility.Collapsed;
}
return value;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) {
throw new NotImplementedException();
}
}
Mẹo: Bạn có thể lấy được giá trị chuyển đổi của bạn từ MarkupExtension và trả lại ví dụ của riêng mình trong ProvideValue ghi đè lên. Vì vậy, bạn có thể sử dụng nó trực tiếp mà không cần tham khảo từ các nguồn tài nguyên.
bài viết rất hay! thank nhiều :D
ReplyDeleteChào tác giả!
ReplyDeleteTác giả có thể hướng dẫn mình và mọi người việc sử dụng binding trong controls DataGrid của WPF mà dữ liệu là một database SQL Server được không? Cảm ơn tác giả!
Thực sự mình không hiểu nhiều về binding lắm nên rất mong nhận được sự hướng dẫn tận tình của tác giả!!
ReplyDeleteChào bạn
ReplyDeleteĐây là hướng dẫn mà bạn cần: http://www.codeproject.com/Articles/242319/DataBinding-in-WPF-Browser-Application-using-Sql-S
Được viết bằng tiếng anh.
Sắp tới mình sẽ dịch và thực hiện một loạt bài ví dụ này.
Cảm ơn bạn đã xem
Thân!