كيفية تغيير محارف ConverterParameter بشكل حيوي (أو أي) من مورد (أو أي مورد آخر) في وقت التشغيل؟
سؤال
أنا جديد على WPF و XAML. أجد حلولا لمعظم المشكلات (بلغات أخرى) من خلال البحث هنا N هناك أو googling حولها ولكن هذا واحد جعلني مجنونا. لقد بحثت كثيرا على Google وتصفح العديد من المنتديات، لكن يبدو أن هذه المرة قابلت تحديا حقيقيا!
لدي ما بعد التعليمات البرمجية في Window.Resources:
<my:NameConverter x:Key="NameConverter"/>
<MultiBinding x:Key="CustomerFullNameBinding"
Converter="{StaticResource NameConverter}"
ConverterParameter="LastNameFirst">
<Binding Path="FirstName" />
<Binding Path="MiddleName" />
<Binding Path="LastName" />
</MultiBinding>
ال Nameconverter. ترجع الطبقة الاسم الكامل عن طريق الجمع بين الأجزاء الفردية من الاسم. تعتمد قيمة الإرجاع على قيمة converterparameter. والتي يمكن أن تكون واحدة مما يلي: الاسم الأول الاسم الأول، LastameFirst، OnlyFirstName، OnlyLastName، الأحرف الأولى (هناك عدد قليل منها؛ ولكن للبساطة، دعونا لا نعتبرهم)
هذا الرمز يعمل بشكل جيد. أنا استخدم التالية للحصول على النتيجة:
<TextBlock Text="{DynamicResource CustomerFullNameBinding}"/>
ومع ذلك، فإن المشكلة هي أنه إذا استخدمت المورد customerfullnamebinding. 20 مرة في التعليمات البرمجية الخاصة بي (مثل إظهار ABOVW) من شأنها أن تظهر جميعها الاسم بتنسيق معين. (أي هنا في إعلان customerulementbinding أنا وضعت ConverterParameter = "lastnamefirst" لذلك جميع المراجع العشرين سوف تظهر الاسم بهذه الطريقة فقط.)
الآن سؤالي هل يمكنني أن أجعلها أكثر تعميمية "بحيث يمكنني ضبط قيمة converterparameter. ديناميكيا؟ أي يمكنني أن أحصل على TextBlocks متعددة يمكنها عرض الاسم الكامل في تنسيقات مختلفة. أعلم أنه من الممكن أن نخلق موارد متعددة مثل يلي:
<MultiBinding x:Key="CustomerFullNameBinding_FirstNameFirst"
Converter="..." ConverterParameter="FirstNameFirst">
......
</MultiBinding>
<MultiBinding x:Key="CustomerFullNameBinding_LastNameFirst"
Converter="..." ConverterParameter="LastNameFirst">
......
</MultiBinding>
<MultiBinding x:Key="CustomerFullNameBinding_OnlyFirstName"
Converter="..." ConverterParameter="OnlyFirstName">
......
</MultiBinding>
... and so on ...
لكنني لا أريد ذلك، "COZ ستجعل رمزي حقا ضخمة للغاية، والأهم من ذلك أنه سيتم إبطال مفهوم إعادة استخدام الموارد!
يرجى اقتراح لي أي حل ممكن.
شكرا لك مقدما.
ملحوظة: حصلت على الفكرة الأصلية من هنا. وبعد يمكن العثور على مثال العمل المماثل msdn.microsoft.com/en-us/library/ms771336.aspx.
العلامات: WPF XAML staticresource dynamicresource ملزمة
المحلول
لتتمكن من تغيير وضع العرض المستخدمة في كل حالة، أعتقد أنني كنت قد فعلت ذلك شيئا مثل هذا:
- إنشاء
UserControl
مع 3.TextBlock
S لعرض أجزاء 3 من الاسم. - أضف خصائص إلى ما سبق لأجزاء الاسم لتكون أهدافا ملزمة.
- أضف عقارا للوضع الذي لعرضه (الاسم الأول, أسم العائلة أولا, ، إلخ.)
ما سبق يتطلب ملزما لكل قطعة من القطع، لذلك طريقة واحدة لتبسيط ذلك سيكون لجعل خاصية واحدة على UserControl
من النوع NameData
أعلن كهيكل مع First
, Middle
, ، و Last
ملكيات. ثم لا يزال بإمكانك استخدام واحد MultiBinding
إلى تلك الممتلكات. الفرق سيكون ذلك NameConverter
سوف يستغرق 3 قطع والعودة جديدة NameData
بنية بدلا من سلسلة منسقة.
<NameTextBlock NameData="{DynamicResource CustomerFullNameBinding}" NameDisplayMode="LastNameFirst" />
<NameTextBlock NameData="{DynamicResource CustomerFullNameBinding}" NameDisplayMode="FirstNameFirst" />
<NameTextBlock NameData="{DynamicResource CustomerFullNameBinding}" NameDisplayMode="Initials" />
<!-- and so on... -->
الفكرة هي فك التنسيق من البيانات.
الجزء الذي تعثرت الأشياء كان يعلن MultiBinding
كمورد. عادة، سيكون هناك MultiBinding
على كل TextBlock
أنت ملزم حتى يمكنك تغيير ConverterParameter
لكل حالة.
تعديل: أعلم أنك تريد أن تكون قادرا على التغيير ConverterParameter
, ، لكن هذا ليس ممكنا حقا بسبب مثيل واحد من MultiBinding
و ConverterParameter
كونها ملكية عادية بدلا من DependencyProperty
, ، والتي ستكون مطلوبة لتكون هدفا DynamicResource
أو Binding
.