Thứ tư, ngày 7 tháng 12 năm 2016

WPF – Read-Only Attached Dependency Property

Ngày đăng: 20/3/2012, 8:43:34PM | Lượt xem: 12,154
Hot!

Trong bài trước tôi đã hướng dẫn cách tạo một Dependency Property đơn giản, tiếp theo chủ đề này là việc tạo Read-Only và Attached Dependency Property. Đây là hai loại Dependency Property được sử dụng cho các mục đích khác nhau, cách tạo chúng cũng có một vài điểm khác biệt so với Dependency Property thông thường.

 

Trong bài trước tôi đã hướng dẫn cách tạo một Dependency Property đơn giản, tiếp theo chủ đề này là việc tạo Read-Only và Attached Dependency Property. Đây là hai loại Dependency Property được sử dụng cho các mục đích khác nhau, cách tạo chúng cũng có một vài điểm khác biệt so với Dependency Property thông thường.

 

Read-Only Dependency Property

Các Read-Only Dependency Property dùng để lưu trữ các giá trị không cho phép người dùng thay đổi. Loại property này được dùng để thể hiện trạng thái của đối tượng, ví dụ như property IsMouseOver.

Để đăng kí một read-only dependency property, bạn cần sử dụng phương thức DependencyProperty.RegisterReadonly() với các tham số tương tự như DependencyProperty.Register() nhưng kiểu trả về lại là kiểu DependencyPropertyKey.

Đối tượng DependencyPropertyKey có thể coi như một khóa để bạn truy xuất đến property thông qua thuộc tính DependencyPropertyKey.DependencyProperty.  Đối tượng này cần được khai báo là private hoặc protected để hạn chế truy xuất từ bên ngoài qua phương thức SetValue(DependencyPropertyKey, Object):

 

private static readonly DependencyPropertyKey AgePropertyKey =
    DependencyProperty.RegisterReadOnly("Age", typeof(int),
                                typeof(Student),
                                new PropertyMetadata(6)
                               );

 

Sau đó tạo một public field kiểu DependencyProperty, tuy nhiên bạn không thể dùng đối tượng này để làm tham số cho phương thức SetValue(DependencyProperty, Object) vì đây là một read-only property.

 

public static readonly DependencyProperty AgeProperty = AgePropertyKey.DependencyProperty;

 

Và cuối cùng là wrapper với private set, như bạn thấy, ta phải dùng phương thức SetValue(DependencyPropertyKey, Object) thay cho SetValue(DependencyProperty, Object):

 

public int Age
{
    get { return (int)GetValue(AgeProperty); }
    private set { SetValue(AgePropertyKey, value); }
}

 

Tổng hợp lại ta có lớp Student hoàn chỉnh với một Read-only Dependency Property là Age:

 

public class Student: DependencyObject
{
    private static readonly DependencyPropertyKey AgePropertyKey =
        DependencyProperty.RegisterReadOnly("Age", typeof(int),
                                            typeof(Student),
                                            new PropertyMetadata(6)
                                           );
    public static readonly DependencyProperty AgeProperty =
        AgePropertyKey.DependencyProperty;

    // CLR Property Wrapper
    public int Age
    {
        get { return (int)GetValue(AgeProperty); }
        private set { SetValue(AgePropertyKey, value); }
    }
}

 

Thử kiểm tra bằng cách gán giá trị cho property Age hoặc qua phương thức SetValue(), bạn sẽ nhận được một ngoại lệ:

System.InvalidOperationException: ‘Age’ property was registered as read-only and cannot be modified without an authorization key.

Attached Property

Attached property là các property được sử dụng bởi một vài control nhưng thực sự chúng được định nghĩa trong các lớp khác. Các ví dụ về attached property mà bạn có thể thấy là layout control như Grid, Canvas, DockPanel (Xem bài WPF – Cơ bản về Layout).

Ví dụ với bạn có một Button trong DockPanel, bạn có thể gán layout Dock.Top cho Button này bằng cách viết (XAML):

<Button DockPanel.Dock=”Top”>Hello!</Button>

Lớp Button thực tế không chứa property Dock mà được định nghĩa trong DockPanel. Trong code-behind, bạn có thể dùng một trong hai cách viết:

 

DockPanel.SetDock(button1,Dock.Bottom);

// or

button1.SetValue(DockPanel.DockProperty, Dock.Bottom);

 

Tạo một attached property cũng tương tự như tạo một dependency property thông thường. Thay vì gọi phương thức DependencyProperty.Register(), bạn phải thay bằng DependencyProperty.RegisterAttached(). Ví dụ DockPanel của WPF định nghĩa một field sau:

 

public static readonly DependencyProperty DockProperty =
DependencyProperty.RegisterAttached("Dock", typeof(Dock), typeof(DockPanel),
new FrameworkPropertyMetadata(Dock.Left));

 

Đồng thời thêm hai phương thức SetDock() và GetDock(), ở đây ta không cần tạo một wrapper cho property. Như vậy lớp DockPanel trong WPF được định nghĩa theo dạng sau:

 

public class DockPanel : Panel
{
    // ...
    public static readonly DependencyProperty DockProperty =
        DependencyProperty.RegisterAttached("Dock", typeof(Dock), typeof(DockPanel),
        new FrameworkPropertyMetadata(Dock.Left));

    public static void SetDock(UIElement element, Dock value)
    {
        element.SetValue(DockProperty, value);
    }

    public static Dock GetDock(UIElement element)
    {
        return (Dock)element.GetValue(DockProperty);
    }
    // ...
}

 

http://yinyangit.wordpress.com

 Chia sẻ qua: 
Hot!
Ý kiến bạn đọc

These items will be permanently deleted and cannot be recovered. Are you sure?

Gallery

image

Maecenas viverra rutrum pulvinar

Maecenas viverra rutrum pulvinar! Aenean vehicula nulla sit amet metus aliquam et malesuada risus aliquet. Vestibulum rhoncus, dolor sit amet venenatis porta, metus purus sagittis nisl, sodales volutpat elit lorem…

Read more

Text Links

Thiết kế logo chuyên nghiệp Insky
DAFABET
W88 w88b.com/dang-ky-tai-khoan-w88
W88
Copyright © 2011 - 2012 vietshare.vn by phamkhuong102@gmail.com doanhkisi2315@gmail.com. All rights reserved.