2009-05-07 41 views
5

Tôi đã có một điều khiển WPF cho thấy một trong số đó là trẻ em (từ đó là ControlTemplate) thông qua một tài sản chỉ đọc. Tại thời điểm này nó chỉ là một tài sản CLR, nhưng tôi không nghĩ rằng làm cho bất kỳ sự khác biệt.Tôi có thể sử dụng XAML để thiết lập thuộc tính lồng nhau (thuộc tính của giá trị của thuộc tính) của điều khiển không?

Tôi muốn có thể đặt một trong các thuộc tính trên điều khiển con từ XAML nơi tôi đang khởi tạo điều khiển chính. (Trên thực tế, tôi muốn liên kết với nó, nhưng tôi nghĩ đặt nó sẽ là một bước khởi đầu tốt.)

Dưới đây là một số mã:

public class ChartControl : Control 
{ 
    public IAxis XAxis { get; private set; } 

    public override void OnApplyTemplate() 
    { 
     base.OnApplyTemplate(); 

     this.XAxis = GetTemplateChild("PART_XAxis") as IAxis; 
    } 
} 

public interface IAxis 
{ 
    // This is the property I want to set 
    double Maximum { get; set; } 
} 

public class Axis : FrameworkElement, IAxis 
{ 
    public static readonly DependencyProperty MaximumProperty = DependencyProperty.Register("Maximum", typeof(double), typeof(Axis), new FrameworkPropertyMetadata(20.0, FrameworkPropertyMetadataOptions.AffectsRender, OnAxisPropertyChanged)); 

    public double Maximum 
    { 
     get { return (double)GetValue(MaximumProperty); } 
     set { SetValue(MaximumProperty, value); } 
    } 
} 

Dưới đây là hai cách tôi có thể nghĩ ra cách thiết lập các lồng nhau tài sản trong XAML (không biên dịch):

<!-- 
    This doesn't work: 
    "The property 'XAxis.Maximum' does not exist in XML namespace 'http://schemas.microsoft.com/winfx/2006/xaml/presentation'." 
    "The attachable property 'Maximum' was not found in type 'XAxis'." 
--> 
<local:ChartControl XAxis.Maximum="{Binding Maximum}"/> 

<!-- 
    This doesn't work: 
    "Cannot set properties on property elements." 
--> 
<local:ChartControl> 
    <local:ChartControl.XAxis Maximum="{Binding Maximum}"/> 
</local:ChartControl> 

Điều này thậm chí còn có thể?

Nếu không có nó tôi đoán tôi sẽ chỉ cần để lộ DP trên điều khiển chính mà có được ràng buộc thông qua cho trẻ em (trong mẫu). Không phải là quá tệ, tôi đoán vậy, nhưng tôi chỉ cố gắng tránh sự bùng nổ của tài sản trên sự kiểm soát chính.

Chúc mừng.

Trả lời

4

Bạn không thể làm như thế này ... bạn có thể truy cập các thuộc tính lồng nhau thông qua đường dẫn của nó trong một ràng buộc, nhưng không phải khi bạn xác định giá trị của thuộc tính.

Bạn phải làm một cái gì đó như thế:

<local:ChartControl> 
    <local:ChartControl.XAxis> 
     <local:Axis Maximum="{Binding Maximum}"/> 
    </local:ChartControl.XAxis> 
</local:ChartControl> 
+0

Yeah, đó là những gì tôi nghĩ. :-( DP bổ sung trên điều khiển cấp cao nhất của tôi, sau đó! – Swythan

+6

BTW. Tôi không thể làm điều đó như trong ví dụ XAML của bạn, vì tôi không muốn thay thế giá trị hiện tại của thuộc tính XAxis bằng Ví dụ mới của Axis – Swythan

+0

Tôi tự hỏi lý do cho WPF không hỗ trợ ràng buộc với các thuộc tính lồng nhau là gì? Nếu không bạn sẽ sao chép chúng. – Vitalij

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