2009-11-30 11 views
10

Czy można uzyskać DependencyProperty w klasie pochodnej MarkupExtension?DepedencyProperty wewnątrz 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 
     } 
    } 
} 

Rozszerzenie jest używane w poniższym fragmencie.

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

Czy można nawet zbudować takie przedłużenie, czy też właśnie szczerzę złe drzewo? (powyższy kod zostanie skompilowany i uruchomiony, ale opublikowałem go tutaj, aby najlepiej zilustrować problem).

Odpowiedz

5

Nie można dodać tylko właściwości zależność do klas, które pochodzą z DependencyObject, MarkupExtention pochodzi bezpośrednio z Object

+0

W takim przypadku co z wiążącym rozszerzeniem znaczników? Jego właściwości można powiązać samodzielnie, więc są to właściwości zależności. – Narek

+0

@Narek - zgodnie z MSDN rozszerzenie powiązania znaczników nie ma właściwości zależności, ma to sens, ponieważ nie można zaimplementować właściwości zależności bez wywoływania DependencyObject.SetValue i DependencyObject.GetValue i nie można wywoływać tych bez dziedziczenia z DependencyObject. także, nie mogę przetestować tego teraz, ale nie sądzę, że możesz użyć wiązania na własność wiązania, to znaczy nie możesz {Binding Converter = {Binding ...}} – Nir

+0

W rzeczywistości nie mam jakiekolwiek doświadczenie w WPF, ale w Silverlight 5 zdecydowanie możliwe jest użycie wiązania na własność wiązania. Oto przykład: "{Binding UserName, RelativeSource = {RelativeSource FindAncestor, AncestorType = UserControl}}". – Narek

0

Yea .. to brzydki problemem .. Jednak to ma prostą non intuicyjny odpowiedź. Utwórz inne rozszerzenie znaczników, aby uzyskać statyczny zasób. Więc zamiast korzystania {StaticResource shapesDS}

by utworzyć nowy MarkupExtension nazwie DataSetLocator

Nie zamierzam napisać kod, ale stanowić wartość musiałaby zwrócić zestaw danych na podstawie nazwy lub innego wejścia.

Następnie należy zmienić XAML mieć używać swojego rozszerzenie przykładzie przedłużający zestawu danych lokalizator Source="{DataSetLocator name=shapesDS }"

Szkoda, że ​​rozszerzenia nie rozciągają DependencyProperty ale tak nie jest.

-1

Po prostu użyj IMarkupExtension zamiast MarkupExtension i możesz rozszerzyć DependencyObject. Przynajmniej w Silverlight 5 możesz, ale zakładam, że WPF również to ma.

+6

WPF nie ma rozszerzenia IMarkupExtension. – Brian

Powiązane problemy