1. attached properties là gì
Khi tạo giao diện với xaml trong wpf sẽ có các property riêng của từng thẻ UI. Ví dụ property AutoGenerateColumns của thẻ Datagrid hay property MinWidth MinHeight mà hầu như thẻ UI nào cũng có.
Attached Property là property do chính bạn định nghĩa và tạo ra. Nó có thể gán cho bất kỳ thẻ UI nào. Để hiểu rõ hơn xem ví dụ sau đây
2. Tạo attached property lấy tỷ lệ width / height của UI
Ở đây mình muốn tạo 1 property gọi là RatioWH để lấy dc tỷ lệ của width / height của 1 thẻ UI bất kỳ
B1: Tạo class AttachDemo
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 |
using System.Windows; namespace Views.Lib { public class AttachDemo: DependencyObject { #region Attached property "RatioWH" public const string RatioWHPropertyName = "RatioWH"; // Dang ky property voi ten "RatioWH". // Chu y rang OnRatioWHChanged la method duoc goi khi // gia tri cua RatioWH bi thay doi public static readonly DependencyProperty IsEnabledProperty = DependencyProperty.RegisterAttached( RatioWHPropertyName, typeof(double), typeof(AttachDemo), new PropertyMetadata(false, OnRatioWHChanged )); //Tinh ty le width / height cua the UI duoc gan property ratioWH public static bool GetRatioWH(DependencyObject obj) { return (double)obj.GetValue(ActualWidthProperty) / (double)obj.GetValue(ActualHeightProperty) } public static void SetRatioWH(DependencyObject obj, bool value) { //TODO } //Xu ly khi property ratioWH bi thay doi private static void OnIsEnabledChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args) { //TODO } } } |
B2: Gán property mới này cho thẻ bất kỳ. Ví dụ 1 thẻ Grid
1 2 3 4 5 6 7 8 9 10 11 |
<UserControl x:Class="SeaHorse.Views.Dashboard.RetrainingStatusList" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:prism="http://prismlibrary.com/" xmlns:lib="clr-namespace:Views.Lib" prism:ViewModelLocator.AutoWireViewModel="True" > <Grid lib:AttachDemo.RatioWH ={Binding RatioWH}> ... </Grid> </UserControl> |
B3: Trên ViewModel khi get giá trị của RatioWH ta sẽ lấy dc tỷ lệ width / height của thẻ Grid.
Tương tự như vậy ta có thể sử dụng property này cho các thẻ UI khác.