2009-11-30 8 views
10

bir MarkupExtension türetilmiş sınıf içinde mümkün mü?DepedencyProperty bir MarkupExtension içinde

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 
     } 
    } 
} 

uzantı aşağıdaki kod kullanılır.

<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> 

Böyle bir uzantı oluşturmak mümkün mü yoksa sadece yanlış ağacı havlıyor muyum? (Yukarıdaki kod derlenmez ve çalışır, ancak ben sorunu en iyi şekilde göstermek için buraya gönderdim).

cevap

5

Hayır, sadece DependencyObject türetilen sınıflara bağımlılık özelliklerini ekleyebilir, MarkupExtention Nesne

+0

Bu durumda bağlama biçimlendirme uzantısı nedir? Bu özellikler kendi başına bağlanabilir, bu yüzden bağımlılık özellikleridir. – Narek

+0

@Narek - MSDN'e göre, bağlayıcı biçimlendirme uzantısı bağımlılık özelliklerine sahip değildir, çünkü bağımlılık özelliklerini DependencyObject.SetValue ve DependencyObject.GetValue çağırmadan uygulayamazsınız ve DependencyObject öğesinden devralmayanları arayamazsınız. Ayrıca, şu anda bunu test edemiyorum ama bağlamanın kendi özellikleri üzerinde bağlayıcı kullanabileceğinizi sanmıyorum, bunu yapamazsınız {Binding Converter = {Binding ...}} – Nir

+0

Aslında yok WPF'deki herhangi bir deneyim, ancak Silverlight 5'te, bağlayıcının kendi özellikleri üzerinde bağlayıcı kullanmak kesinlikle mümkündür. İşte bir örnek: "{Binding UserName, RelativeSource = {RelativeSource FindAncestor, AncestorType = UserControl}}". – Narek

0

Evet doğrudan türetilmiştir .. o basit olmayan sezgisel cevabı var .. Ancak çirkin bir problem. Statik kaynağı almak için başka bir biçimlendirme uzantısı oluşturun. Yani yerine bir isim veya başka bir girişe dayalı veri kümesini dönmek gerekir {StaticResource shapesDS}

Ne kod yazmak için gitmiyorum DataSetLocator

adlı yeni MarkupExtension oluşturmak ancak Sağlanacak değeri kullanarak.

Sonra uzatma veri kümesi bulma aracı uzantısı ömeği Source="{DataSetLocator name=shapesDS }"

Bu uzantılar DependencyProperty uzatmaz ama onlar değil bu çok kötü kullanılmasını sağlamak için xaml değiştirin.

-1

Sadece MarkupExtension yerine IMarkupExtension kullanın ve DependencyObject öğesini genişletebilirsiniz. En azından Silverlight 5'de yapabilirsin, ama WPF'nin de sahip olduğunu varsayabilirim.

+6

WPF'de IMarkupExtension yok. – Brian