سؤال

هل من الممكن أن يكون هناك DependencyProperty ضمن فئة مشتقة 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
        }
    }
}

ويستخدم هذا التمديد في المقتطف التالي.

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

هل من الممكن لبناء مثل هذا التمديد أو أنا فقط ينبح حتى الشجرة خاطئة؟ (رمز أعلاه لن تجميع وتشغيل، ولكن أنا نشره هنا لتوضيح أفضل للمشكلة).

هل كانت مفيدة؟

المحلول

لا، يمكنك إضافة خصائص الاعتماد فقط على الفئات التي هي مستمدة من DependencyObject، مشتق MarkupExtention مباشرة من كائن

نصائح أخرى

نعم .. انها مشكلة قبيحة .. ومع ذلك لديه الجواب بسيط غير بديهية. إنشاء امتداد علامات أخرى للحصول على موارد ثابتة. وذلك بدلا من استخدام {StaticResource shapesDS}

وأنت من شأنه أن يخلق MarkupExtension جديد يسمى DataSetLocator

وأنا لا أريد أن أكتب رمز ولكن توفير قيمة في حاجة للعودة مجموعة البيانات الخاصة بك على أساس اسم أو بعض المدخلات الأخرى.

وبعد ذلك قمت بتغيير XAML لديك الملحق الخاص بك استخدام بيانات تحديد المواقع تمديد سبيل المثال Source="{DataSetLocator name=shapesDS }"

وأنها سيئة للغاية أن التمديد لا تمتد DependencyProperty ولكن لم يفعلوا ذلك.

ومجرد استخدام IMarkupExtension بدلا من MarkupExtension ويمكنك توسيع DependencyObject. على الأقل في سيلفرلايت 5 يمكنك، ولكن أود أن نفترض WPF لديها أيضا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top