如何有条件地将StringFormat应用于wpf文本框

时间:2014-04-22 08:34:02

标签: c# wpf datepicker

我有一个从DB填充的文本框。 DB值必须是字符串格式,由于StringFormat而发生。该值可以由用户更改。如果用户以不同的格式编辑值,则String Formatter不应重新格式化它。

我怎样才能实现这个目标?

<TextBox x:Name="txtStartDate" 
         Height="24" Width="80" Padding="0" MaxLength="10" 
         Text="{Binding Path=SelectedDate, StringFormat='ddd, ddMMM',
         RelativeSource={RelativeSource AncestorType={x:Type DatePicker}}}"
         />

文本框是实际项目中的自定义控件。

E.g。 数据库发送一个值为May30,它将转换为30May并显示在文本框中,这是预期的。 现在,如果用户将其更改回May30,则不应对其进行转换,并且应显示May30。 实际发生的是该值被格式化为30May,因此想要在用户触摸值时阻止格式化。

1 个答案:

答案 0 :(得分:0)

编写WPF时,始终最好为您的观看次数/ UserControl和/或Window提供所需的确切数据。根据您的要求,我会添加一些额外的属性来简化此问题。我需要一个DateTime属性,一个string属性和一个bool属性。 DateTime属性显然从DatePicker获取日期,string输出显示的值,bool属性指定是否将字符串格式应用于日期值或不。你可以尝试这样的事情:

public DateTime Date // Bind with DatePicker
{
    get { return date; }
    set 
    {
        date = value;
        NotifyPropertyChanged("Date");
        IsFormatted = YourLogicHere();
    }
}

public bool IsFormatted { get; set; }

public string DateValue
{
    get { return IsFormatted ? Date.ToString("ddd, ddMMM") : Date.ToString(); }
}

因此,DateValue属性是UI中显示的属性,将输出默认的DateTime值或格式化的值,具体取决于IsFormatted属性的值。基本的想法是根据您的要求将此IsFormatted属性设置为truefalse

我认为您说依赖于用户更改值或其他内容,因此当用户更改值时,您可以将其设置为true,然后它将仅输出未格式化的日期版本。您可能需要添加另一个属性或更改此示例中的某些内容以实现您的要求,但您现在应该已经了解了这个想法,我相信您可以从此处完成它。