DepedencyProperty in MarkupExtension
-
10-07-2019 - |
Domanda
È possibile avere un DependencyProperty
all'interno di una classe derivata 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
}
}
}
L'estensione è utilizzata nel seguente frammento.
<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>
È anche possibile costruire una simile estensione o sto solo abbaiando sull'albero sbagliato? (il codice sopra non verrà compilato ed eseguito, ma l'ho pubblicato qui per illustrare meglio il problema).
Soluzione
No, puoi solo aggiungere proprietà di dipendenza alle classi derivate da DependencyObject, MarkupExtention è derivato direttamente dall'oggetto
Altri suggerimenti
Sì .. è un brutto problema .. Tuttavia ha una risposta semplice e non intuitiva.
Crea un'altra estensione di markup per ottenere la risorsa statica.
Quindi invece di usare {StaticResource shapesDS}
Dovresti creare un nuovo MarkupExtension chiamato DataSetLocator
Non scriverò il codice ma il valore Fornire dovrebbe restituire il set di dati in base a un nome o ad altri input.
Quindi cambi il tuo xaml in modo che la tua estensione usi l'esempio di estensione del localizzatore del set di dati Source = " {DataSetLocator name = shapesDS} "
È un peccato che le estensioni non estendano DependencyProperty ma non lo fanno.
Usa semplicemente IMarkupExtension invece di MarkupExtension e puoi estendere DependencyObject. Almeno in Silverlight 5 puoi, ma suppongo che anche WPF ce l'abbia.