إجبار تحويل لتحويل دائما عند استخدام محول مخصص في WPF؟

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

  •  13-09-2019
  •  | 
  •  

سؤال

أقوم بتنفيذ محول تاريخ مخصص في WPF، والفكرة أن تكون أكثر ذكاء حول دخول التاريخ، A La Outlook (القدرة على الدخول "اليوم"، إلخ) لذلك لقد كتبت محولي، الذي يعمل. إنه تنسيق إدخال المستخدم في التنسيق M / D / YY. لذلك على سبيل المثال، إذا دخلوا: 8-2، سوف يرون 8/2/09. محبوب.

السؤال هو: هناك العديد من الأشياء التي يمكن للمستخدم إدخالها في نهاية المطاف في نفس التاريخ. (8-2 و 8/2، كونها أمثلة سهلة). لذلك دعونا نقول فقط أنهم يبدأون عن طريق إدخال 8/2، والذي يحصل على ConstrackBack وتحويله، ويتم عرضه على أنه 8/2/09. حتى الان جيدة جدا. الآن دعونا نقول أنهم يدخلون 8-2 (أو 8/2 مرة أخرى) في نفس المجال، بعد ذلك مباشرة. التي يتم تشغيلها على الرغم من ConstressBack، والتي تنتج نفس التاريخ الموجود بالفعل في الممتلكات المرتبطة، لذلك لا تهتم بتشغيل التحويل، مما يعني أن "8/2" يجلس هناك في مربع النص. ييك لا توجد مشكلة في البيانات، فقط عرض واحد، ولكن مهلا، تعد neatness.

كيف يمكنني إجبار WPF على تشغيل تحويل بعد إدخالات كل (غير خاطئة)؟

إليك نسخة مبسطة من المحول:

    public class DateConverter : IValueConverter
{
    #region IValueConverter Members

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value != null)
        {
            string tempStr = value.ToString();
            return ((DateTime.Parse(tempStr)).ToString("M/d/yy"));
        }
        else
        {
            return null;
        }
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return DateTime.Parse(value.ToString());
    }

    #endregion
}

وهنا ما يبدو عليه استخدامه:

      <local:FilteredTextBox.Text>
        <Binding Path="Value" ElementName="root" Converter="{StaticResource DateConv}" 
           UpdateSourceTrigger="LostFocus"  Mode="TwoWay" diagnostics:PresentationTraceSources.TraceLevel="High"
        NotifyOnValidationError="True" ValidatesOnDataErrors="True" ValidatesOnExceptions="True">
          <Binding.ValidationRules>
                <local:DateValidation/>
          </Binding.ValidationRules>
        </Binding>
      </local:FilteredTextBox.Text>

شكرًا! سكوت

ردا على تعليق أدناه، إليك ممتلكات الدعم:

      public DateTime? Value
    {
        get
        {
            return (DateTime?)GetValue(ValueProperty);
        }
        set
        {
            SetValue(ValueProperty, value);
            OnPropertyChanged(new DependencyPropertyChangedEventArgs(ValueProperty, null, value)); // I just added this line, it makes no difference
        }
    }
هل كانت مفيدة؟

المحلول 2

شكرا جزيلا ل Josh G - مع مساعدته، أحسب إجابة (أو على الأقل).

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

  public DateTime? DateValue
    {
        get
        {
            return _dateValue;
        }
        set
        {
            _dateValue = value;
            OnPropertyChanged("DateValue");
            SetValue(ValueProperty, _dateValue);
        }
    }

وهذا يعمل تماما كما ينبغي. شكرا مرة أخرى يا جوش!

نصائح أخرى

هل من الممكن أن تقوم خاصية بيانات الدعم بإطلاق النار فقط PropertyChanged إذا كان التغيير بالفعل قيمة؟ هل يمكن أن تحاول إطلاق النار PropertyChanged كلما تم استدعاء وظيفة SET بغض النظر عما إذا كانت قيمة التغييرات. هذا سيؤدي إلى تحديث الربط.

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