2009-11-30 14 views
10

Có thể có một DependencyProperty trong một lớp học có nguồn gốc từ MarkupExtension không?DepedencyProperty trong một MarkupExtension

public class GeometryQueryExtension : MarkupExtension 
{ 
    public XmlDataProvider Source { get; set; } 

    public string XPath { get; set; } 

    public static readonly DependencyProperty ArgumentProperty = DependencyProperty.RegisterAttached(
     "Argument", 
     typeof(string), 
     typeof(GeometryQueryExtension)); // this wont work because GeometryQueryExtension is not a DependencyProperty 

    public string Argument 
    { 
     get 
     { 
      return (string)GetValue(ArgumentProperty); // this wont even compile because GeometryQueryExtension doesnt derive from a class which has GetValue 
     } 
     set 
     { 
      SetValue(ArgumentProperty,value);// this wont even compile because GeometryQueryExtension doesnt derive from a class which has SetValue 
     } 
    } 
} 

Tiện ích mở rộng được sử dụng trong đoạn mã sau.

<Label.Content> 
    <local:GeometryQueryExtension Source="{StaticResource shapesDS}"> 
     <local:GeometryQueryExtension.XPath> 
      /Shapes/Geometry/{0} 
     </local:GeometryQueryExtension.XPath> 
     <local:GeometryQueryExtension.Argument> 
      <Binding XPath="Geometry"/> <!-- will throw exception when processing this bind --> 
     </local:GeometryQueryExtension.Argument> 
    </local:GeometryQueryExtension> 
</Label.Content> 

Thậm chí có thể xây dựng phần mở rộng như vậy hoặc tôi chỉ sủa cây sai? (mã ở trên sẽ không biên dịch và chạy, nhưng tôi đã đăng nó ở đây để minh họa tốt nhất vấn đề).

Trả lời

5

Không, bạn chỉ có thể thêm các thuộc tính phụ thuộc đến các lớp học có nguồn gốc từ DependencyObject, MarkupExtention có nguồn gốc trực tiếp từ Object

+0

Trong trường hợp đó, còn phần mở rộng đánh dấu ràng buộc thì sao? Các thuộc tính của nó có thể bị ràng buộc bởi chính chúng, vì vậy chúng là các thuộc tính phụ thuộc. – Narek

+0

@Narek - theo MSDN, phần mở rộng đánh dấu ràng buộc không có thuộc tính phụ thuộc, điều này có ý nghĩa bởi vì bạn không thể triển khai thuộc tính phụ thuộc mà không gọi DependencyObject.SetValue và DependencyObject.GetValue và bạn không thể gọi những thuộc tính không thừa kế từ DependencyObject. Ngoài ra, tôi không thể kiểm tra nó ngay bây giờ nhưng tôi không nghĩ rằng bạn có thể sử dụng ràng buộc vào tài sản riêng của ràng buộc, đó là bạn không thể làm {Binding Converter = {Binding ...}} – Nir

+0

Thực ra tôi không có bất kỳ kinh nghiệm nào trong WPF, nhưng trong Silverlight 5, nó chắc chắn có thể sử dụng sự ràng buộc về các thuộc tính riêng của binding. Đây là một ví dụ: "{Binding UserName, RelativeSource = {RelativeSource FindAncestor, AncestorType = UserControl}}". – Narek

0

Yea .. nó là một vấn đề xấu xí .. Tuy nhiên nó có một câu trả lời không trực quan đơn giản. Tạo một tiện ích đánh dấu khác để nhận tài nguyên tĩnh. Vì vậy, thay vì sử dụng {StaticResource shapesDS}

Bạn sẽ tạo ra một MarkupExtension mới gọi là DataSetLocator

Tôi sẽ không viết mã nhưng Cung cấp giá trị sẽ cần phải trả lại dữ liệu của bạn dựa trên một tên hoặc một số đầu vào khác.

Sau đó, bạn thay đổi XAML của bạn để có phần mở rộng của bạn sử dụng các dữ liệu định vị mở rộng ví dụ Source="{DataSetLocator name=shapesDS }"

Đó là quá xấu mà phần mở rộng không mở rộng thuộc tính phụ thuộc nhưng họ thì không.

-1

Chỉ cần sử dụng IMarkupExtension thay vì MarkupExtension và bạn có thể mở rộng DependencyObject. Ít nhất trong Silverlight 5 bạn có thể, nhưng tôi sẽ giả định WPF cũng có nó.

+6

WPF không có IMarkupExtension. – Brian