Cấp bậc tác giả:

DOTNET

DataBinding trong WPF

Được viết bởi QuangIT ngày 31/07/2012 lúc 01:31 PM
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.
  • 0
  • 13674
Tải tệp tin: Click ở đây

DataBinding trong WPF

W
PF 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ặcbidirectional (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 đổimà 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>

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>

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ộtValueConverter. 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>

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.

Nguồn bài viết: Dngaz.com

BÌNH LUẬN BÀI VIẾT

Bài viết mới nhất

LIKE BOX

Bài viết được xem nhiều nhất

HỌC HTML