首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在WPF中使用自定义转换器时,是否强制转换始终运行?

在WPF中使用自定义转换器时,是否强制转换始终运行?
EN

Stack Overflow用户
提问于 2009-04-22 21:10:30
回答 2查看 2.4K关注 0票数 1

我正在用WPF实现一个自定义的日期转换器,这个想法是在日期输入方面更聪明,就像Outlook一样(能够输入“今天”等等)。所以我已经写了我自己的转换器,它是有效的。它将用户条目的格式设置为M/d/yy。例如,如果他们输入: 8-2,他们将看到8/2/09。可爱的。

问题是:用户可以输入几个东西,最终得到相同的日期。(8-2和8/2是简单的例子)。因此,假设它们从输入8/2开始,然后通过ConvertBack运行并进行转换,最后显示为8/2/09。到目前一切尚好。现在假设他们在同一字段中输入8-2 (或再次输入8/2 )。这是通过ConvertBack运行的,它产生的日期与绑定属性中已经存在的日期相同,所以它不会运行Convert,这意味着"8/2“位于文本框中。伊克!没有数据问题,只有一个显示问题,但嘿,整洁很重要。

如何强制WPF在所有(无错误)条目后运行转换?

下面是该转换器的简化版本:

代码语言:javascript
运行
复制
    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
}

下面是它的用法:

代码语言:javascript
运行
复制
      <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>

谢谢!史考特

为了回应下面的评论,下面是backing属性:

代码语言:javascript
运行
复制
      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
        }
    }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-04-24 17:00:00

非常感谢Josh G--在他的帮助下,我找到了(至少是一个)答案。

这是我正在创建的DatePicker控件中的文本框。因此,我创建了一个中间属性,然后调用依赖属性的set,而不是直接将文本框“锁定”到控件的值:

代码语言:javascript
运行
复制
  public DateTime? DateValue
    {
        get
        {
            return _dateValue;
        }
        set
        {
            _dateValue = value;
            OnPropertyChanged("DateValue");
            SetValue(ValueProperty, _dateValue);
        }
    }

这完全是它应该发挥的作用。再次感谢你,乔希!

票数 0
EN

Stack Overflow用户

发布于 2009-04-22 21:19:29

是否有可能支持数据属性仅在实际更改值时触发PropertyChanged?您可以尝试在调用set函数时触发PropertyChanged,而不管值是否更改。这将导致绑定被更新。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/779243

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档