سؤال

كجزء من تعلم WPF، انتهيت للتو من العمل من خلال تمرين MS LAB يسمى "باستخدام بيانات ملزمة في WPF" (http://windowsclient.net/downloads/folders/hands-on-labs/entry3729.aspx.).

للتوضيح باستخدام EmultivalueConverter، يوجد تطبيق مسبق ترميز واحد حيث يتم استخدام النتيجة المنطقية لتحديد ما إذا كانت ملزمة البيانات ذات صلة للمستخدم الحالي. هنا هو رمز عملية التحويل:

public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) {
        // var rating = int.Parse(values[0].ToString());
        var rating = (int)(values[0]);
        var date = (DateTime)(values[1]);

        // if the user has a good rating (10+) and has been a member for more than a year, special features are available
        return _hasGoodRating(rating) && _isLongTimeMember(date);
    }

وهنا هي الأسلاك لاستخدام هذا في xaml:

<ComboBox.IsEnabled>
    <MultiBinding Converter="{StaticResource specialFeaturesConverter}">
    <Binding Path="CurrentUser.Rating" Source="{x:Static Application.Current}"/>
    <Binding Path="CurrentUser.MemberSince" Source="{x:Static Application.Current}"/>
    </MultiBinding>
</ComboBox.IsEnabled>

يعمل الرمز على ما يرام، لكن مصمم XAML لن يتم تحميله ب "ملحق محدد غير صالح". خطأ. جربت بضعة طرق لعدم استخدام صرفة، واحدة منها تركتها غير مأهولة في التعليمات البرمجية أعلاه. الشيء المضحك هو ممارسة مختبر الانتهاء المقدمة من MS لديها أيضا الخطأ.

هل يعرف أحد كيفية إصلاحه لجعل المصمم سعيدا؟

هتافات،
berryl.

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

المحلول

المشكلة هنا هي أنك تستخدم التطبيق. القضاعة، والتي تختلف في وضع التصميم وفي وقت التشغيل.

عند فتح المصمم، لن يكون التطبيق. لن يكون فئة "التطبيق" (أو ما تسميته). وبالتالي لا توجد خاصية قيد التشغيل هناك، والحصول على هذا الخطأ.

هناك طرق متعددة لإصلاحها. أسهل واحد هو التحقق مما إذا كنت في وضع التصميم:

public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
  if (Application.Current == null ||
      Application.Current.GetType() != typeof(App))
  {
    // We are in design mode, provide some dummy data
    return false;
  }

  var rating = (int)(values[0]);
  var date = (DateTime)(values[1]);

  // if the user has a good rating (10+) and has been a member for more than a year, special features are available
  return _hasGoodRating(rating) && _isLongTimeMember(date);
}

نهج آخر لن يستخدم التطبيق. القضاعة كمصدر لرزمتك.

أتمنى أن يساعدك هذا :).

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