5

Tôi đang cố gắng phát triển một điều khiển tùy chỉnh cho một ứng dụng WinRT/Metro.Cài đặt thuộc tính tùy thuộc vào điều khiển tùy chỉnh của WinRT/Binding

Nó có thuộc tính phụ thuộc và tôi muốn có thể đặt giá trị của nó trong điều khiển tùy chỉnh. Tuy nhiên, việc sử dụng SetValue sẽ phá vỡ mọi ràng buộc mà người tiêu dùng của điều khiển có thể đã tạo ra.

Không có giải pháp nào tôi đã tìm thấy (ví dụ: SetCurrentValue) dường như áp dụng cho WinRT/Metro. Có một giải pháp cho điều này?

Nghe có vẻ như là một điều đơn giản để làm và - trung thực! - Tôi đã cố gắng tìm một giải pháp ở đây và ở nơi khác. Mọi sự trợ giúp sẽ rất được trân trọng.

Trả lời

2

Bạn có thể đặt giá trị mặc định trong PropertyMetadata (TS WPF's snippets để giải cứu!).

#region IsAvailable 
private static bool DefaultIsAvailable = false; 

/// <summary> 
/// IsAvailable Dependency Property 
/// </summary> 
public static readonly DependencyProperty IsAvailableProperty = 
    DependencyProperty.Register(
     "IsAvailable", 
     typeof(bool), 
     typeof(CustomControl1), 
     new PropertyMetadata(DefaultIsAvailable, OnIsAvailableChanged)); 

/// <summary> 
/// Gets or sets the IsAvailable property. This dependency property 
/// indicates .... 
/// </summary> 
public bool IsAvailable 
{ 
    get { return (bool)GetValue(IsAvailableProperty); } 
    set { SetValue(IsAvailableProperty, value); } 
} 

/// <summary> 
/// Handles changes to the IsAvailable property. 
/// </summary> 
/// <param name="d"> 
/// The <see cref="DependencyObject"/> on which 
/// the property has changed value. 
/// </param> 
/// <param name="e"> 
/// Event data that is issued by any event that 
/// tracks changes to the effective value of this property. 
/// </param> 
private static void OnIsAvailableChanged(
    DependencyObject d, DependencyPropertyChangedEventArgs e) 
{ 
    var target = (CustomControl1)d; 
    bool oldIsAvailable = (bool)e.OldValue; 
    bool newIsAvailable = target.IsAvailable; 
    target.OnIsAvailableChanged(oldIsAvailable, newIsAvailable); 
} 

/// <summary> 
/// Provides derived classes an opportunity to handle changes 
/// to the IsAvailable property. 
/// </summary> 
/// <param name="oldIsAvailable">The old IsAvailable value</param> 
/// <param name="newIsAvailable">The new IsAvailable value</param> 
protected virtual void OnIsAvailableChanged(
    bool oldIsAvailable, bool newIsAvailable) 
{ 
} 
#endregion 

EDIT *

Nếu bạn muốn thay đổi các giá trị - bạn có thể, nhưng nếu bạn sử dụng một ràng buộc cơ bản đó là OneWay - tức là - phải mất giá trị từ một nguồn ràng buộc và đặt nó vào thuộc tính phụ thuộc - ràng buộc sẽ ngừng hoạt động vì các giá trị nguồn và đích sẽ không được đồng bộ hóa nữa.

Nếu bạn đặt Mode="TwoWay" - nguồn ràng buộc sẽ được cập nhật khi mục tiêu ràng buộc (điều khiển của bạn) sửa đổi thuộc tính phụ thuộc, vì vậy ràng buộc sẽ vẫn hợp lệ và sẽ tiếp tục hoạt động theo cả hai cách.

+0

Câu trả lời của bạn chỉ ra rằng việc đặt giá trị sẽ phá vỡ ràng buộc - đó là lý do tôi đặt câu hỏi. Cách thay thế duy nhất tôi có thể nghĩ đến là triển khai INotifyPropertyChanged và sử dụng thuộc tính "thông thường" - nhưng sau đó người dùng không thể liên kết với nó. –

+0

Hmmm, thực sự - tôi đã bối rối. Các ràng buộc sẽ không phá vỡ nếu bạn thiết lập chế độ để TwoWay. –

+1

Theo http://msdn.microsoft.com/en-us/library/windows/apps/hh700353 Ràng buộc được coi là giá trị cục bộ cho mục đích ưu tiên giá trị thuộc tính phụ thuộc, có nghĩa là nếu bạn đặt một giá trị cục bộ khác cho một tài sản ban đầu được giữ một giá trị ràng buộc, bạn sẽ loại bỏ ràng buộc. Đây là hành vi mà tôi dường như đang gặp phải –

Các vấn đề liên quan