سؤال

أحاول كتابة مخصص MarkupExtension يتيح لي ذلك استخدام آلياتي الخاصة لتحديد الربط ، ولكن عندما أحاول إعادة أ MultiBinding من وجهة نظري MarkupExtension أحصل على الاستثناء أعلاه.

أملك:

<TextBlock Text="{my:CustomMarkup ...}" />

CustomMarkup إرجاع أ MultiBinding, ، ولكن على ما يبدو Text لا يحب تعيينه على MultiBinding. كيف يعمل عندما أقول:

<TextBlock>
    <TextBlock.Text>
        <MultiBinding ... />
    </TextBlock.Text>
</TextBlock>

لكن هذا لا يعمل بالطريقة التي أفعلها؟

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

المحلول

لا تعيد MultiBinding بحد ذاتها. بدلاً من ذلك ، أعد نتيجة MultiBinding.ProvideValue.

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

نصائح أخرى

فعلت بعض التحقيق ، واتضح أنه من المفترض أن أقوم بالفعل بتعيين الربط في طريقة توفير MarkUpextension ثم إرجاع القيمة الحالية للربط. القليل من غير بديهي ولكن يبدو أنه يعمل حتى الآن!

هذا ما انتهى بي الأمر تقريبًا:

public override object ProvideValue( IServiceProvider serviceProvider ) {
    IProvideValueTarget valueProvider = (IProvideValueTarget)serviceProvider.GetService( typeof( IProvideValueTarget ) );
    // only need to do this if they're needed in your logic:
    object @target = valueProvider.TargetObject;
    object @property = valueProvider.TargetProperty;

    MultiBinding result = new MultiBinding();

    // set up binding as per custom logic...

    return result.ProvideValue( serviceProvider );
}

أضف القليل من المنطق ، والغبار بخفة مع معالجة الأخطاء وتقديمها.

تحديث: تبين أن متعددة التوترات. serviceProvider. هذا أكثر نظافة.

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