Frage

Ist es möglich, ein DependencyProperty innerhalb einer MarkupExtension abgeleiteten Klasse zu haben?

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

Die Erweiterung im folgenden Ausschnitt verwendet wird.

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

Ist es sogar möglich, eine solche Verlängerung zu bauen oder bin ich nur den Holzweg? (Der Code oben wird nicht kompilieren und ausführen, aber ich habe es hier das Problem zu veranschaulichen).

War es hilfreich?

Lösung

Nein, Sie können nur Abhängigkeitseigenschaften zu Klassen hinzufügen, die von DependencyObject abgeleitet werden, wird MarkupExtention direkt von Object abgeleitet

Andere Tipps

Ja .. es ist ein hässliches Problem .. Jedoch hat es eine einfache, nicht intuitive Antwort. Erstellen Sie eine andere Markup-Erweiterung die statische Ressource zu erhalten. Anstatt also mit {StaticResource shapesDS}

Sie würden erstellen Sie eine neue Markupextension genannt DataSetLocator

Ich werde nicht um den Code zu schreiben, aber der Wert Geben Sie müßte Ihr Daten-Set zurückzukehren, basierend auf einem Namen oder einen anderen Eingang.

Sie dann Ihre XAML ändern Ihre Erweiterung verwenden, um die Daten-Set-Locator-Erweiterung Beispiel Source="{DataSetLocator name=shapesDS }" haben

Es ist zu schade, dass Erweiterungen erstrecken sich nicht DependencyProperty, aber sie nicht.

Verwenden Sie einfach IMarkupExtension statt Markupextension und Sie können DependencyObject verlängern. Zumindest in Silverlight 5 Sie können, aber ich würde davon ausgehen, WPF hat es auch.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top