كيفية تغيير محارف ConverterParameter بشكل حيوي (أو أي) من مورد (أو أي مورد آخر) في وقت التشغيل؟

StackOverflow https://stackoverflow.com/questions/1272049

سؤال

أنا جديد على 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. TextBlockS لعرض أجزاء 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.

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