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 đề).
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
@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
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