كيف يمكنني تحرير ثابتة الكائنات في WPF دون تكرار الرمز ؟

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

  •  21-08-2019
  •  | 
  •  

سؤال

لدينا الكثير من ثابتة القيمة الكائنات في المجال لدينا نموذج مثال واحد على هذا الموقف ، يحددها وخط العرض ، وخط الطول والارتفاع.

/// <remarks>When I grow up I want to be an F# record.</remarks>
public class Position
{
    public double Latitude
    {
        get;
        private set;
    }

    // snip

    public Position(double latitude, double longitude, double height)
    {
        Latitude = latitude;
        // snip
    }
}

طريقة واضحة للسماح تحرير الموقف هو بناء ViewModel الذي حاصل و واضعي ، وكذلك ToPosition() طريقة استخراج التحقق من صحة ثابتة موقف سبيل المثال.في حين أن هذا الحل سيكون موافق ، فإن ذلك سيؤدي إلى الكثير من تكرار رمز ، وخاصة XAML.

قيمة الأشياء في السؤال تتكون من ثلاثة إلى خمسة الخصائص التي هي عادة بعض المتغير X ، Y ، Z & بعض المساعدة الأشياء.ونظرا لهذا, لقد نظرت في خلق ثلاثة ViewModels على التعامل مع مختلف الاحتمالات ، حيث كل ViewModel سوف تحتاج إلى كشف خصائص قيمة كل عقار وكذلك وصف عرض لكل التسمية (على سبيل المثال."العرض").

الذهاب إلى أبعد من ذلك ، يبدو أنني يمكن تبسيط ذلك إلى عام واحد ViewModel يمكن أن تتعامل مع ن خصائص ربط كل شيء باستخدام التفكير.شيء مثل عقار شبكة ، ولكن غير قابل للتغيير الكائنات.مسألة واحدة مع خاصية الشبكة هو أن كنت تريد أن تكون قادرة على تغيير نظرة لذلك أنا يمكن أن يكون لها تسميات مربعات النص مثل:

Latitude:   [      32 ]  <- TextBox
Longitude:  [     115 ]
Height:     [      12 ]

أو وضعه في DataGrid مثل:

Latitude  |  Longitude  |  Height
      32           115         12

لذا سؤالي هو:

هل يمكنك التفكير في طريقة أنيقة لحل هذه المشكلة ؟ هل هناك أي المكتبات التي تفعل هذا أو مقالات عن شيء مماثل ؟

أنا أساسا تبحث عن:

  • رمز الازدواج إلى أن يكون الحد الأدنى
  • سهلة لإضافة قيمة جديدة أنواع الكائنات
  • من الممكن تمديد مع بعض نوع من التحقق من صحة
هل كانت مفيدة؟

المحلول

لقد وجدت هذا السؤال أثناء بحثه بلدي الخيارات الممكنة في نفس الوضع.فكرت أن التحديث في حالة أي شخص آخر يتعثر في ذلك:

خيار آخر (غير متوفر عند بول عرضت له حل منذ ذلك الحين .صافي 4 لم يخرج حتى الآن) هو استخدام نفس الاستراتيجية ، ولكن بدلا من تنفيذ ذلك باستخدام CustomTypeDescriptors, استخدام مزيج من الأدوية ، الكائنات الحيوية والتفكير لتحقيق نفس التأثير.

في هذه الحالة ، يمكنك تحديد فئة

class Mutable<ImmutableType> : DynamicObject
{
   //...
}

إنه يأخذ منشئ مثيل ثابتة نوع مندوب أن يبني مثيل جديد من خارج القاموس كما في إجابة بولس.الفرق هنا هو أن تجاوز TryGetMember و TrySetMember تعبئة داخلية القاموس أن كنت في نهاية المطاف الانتقال لاستخدام حجة منشئ-مندوب.يمكنك استخدام التفكير من أجل التحقق من أن الخصائص فقط أنك قبول هي تلك التي يتم تنفيذها فعليا في ImmutableType.

أداء الحكمة, أراهن أن إجابة بولس هو أسرع و لا تنطوي على الكائنات الحيوية ، والتي هي معروفة لوضع C# المطورين في تناسبها.ولكن تنفيذ هذا الحل أيضا أبسط قليلا ، لأنه نوع واصفات قليلا غامضة.


وهنا طلب إثبات صحة مفهوم / تنفيذ سبيل المثال:

https://bitbucket.org/jwrush/mutable-generic-example

نصائح أخرى

نوع مخصص واصفات يمكن استخدامها لحل هذه المشكلة.قبل أن يمكنك ربط إلى الموقف الخاص بك اكتب واصف أن ركلة وتوفير وتعيين طرق مؤقتا بناء القيم.عندما يتغير ملتزمون ، فإنه يمكن بناء الثابت الكائن.

قد تبدو شيئا مثل هذا:

DataContext = new Mutable(position, 
    dictionary => new Position(dictionary["lattitude"], ...)
);

الخاص بك الارتباطات يمكن أن لا تزال تبدو مثل هذا:

<TextBox Text="{Binding Path=Lattitude}" />

لأن قابلة للتغيير الكائن 'التظاهر' أن لها خصائص مثل Lattitude بفضل TypeDescriptor.

بدلا من ذلك يمكنك استخدام محول في الربط والتوصل إلى نوع من الاتفاقية.

الخاصة بك قابلة للتغيير فئة تأخذ الحالي غير قابل للتغيير كائن ، Func<IDictionary, object> هذا يسمح لك لخلق جديدة ثابتة الكائن بمجرد تحرير يكمل.الخاصة بك قابلة للتغيير فئة من شأنه أن يجعل استخدام نوع واصف ، التي من شأنها خلق PropertyDescriptors التي تخلق جديدة ثابتة الكائن عند إعدادها.

للحصول على مثال عن كيفية استخدام نوع واصفات ، انظر هنا:

http://www.paulstovell.com/editable-object-adapter

تحرير:إذا كنت تريد أن تحد كيف في كثير من الأحيان الخاص بك غير قابل للتغيير يتم إنشاء الكائنات, قد تبدو أيضا في BindingGroups و IEditableObject ، والتي الخاص بك قابلة للتغيير ويمكن أيضا تنفيذ.

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

بصراحة أنت فقط الرقص حول المشكلة ولكن لا أذكر المشكلة نفسها ;).

إذا كنت تخمين صحيح المشكلة الخاصة بك ، ثم مزيج من MultiBinding و IMultiValueConverter ينبغي أن تفعل خدعة.

HTH.

P. S.راجع للشغل, لديك ثابتة فئة الحالات لا قيمة الأشياء.مع قيمة الأشياء (التي تم وصفها من قبل struct الكلمة) الرقص أكثر لا يهم إذا كانت هناك واضعي أو لا :).

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