gpt4 book ai didi

wpf - 更改时 DateTime 属性未触发 PropertyChanged 事件

转载 作者:行者123 更新时间:2023-12-03 10:15:30 25 4
gpt4 key购买 nike

我正在开发一个 WPF MVVM 应用程序,并且我的 View 上有一个 TextBox,它绑定(bind)到 ViewModel 上的 DateTime 属性。看起来很简单,但是当我清除 TextBox 中的文本时,属性永远不会改变。事实上,直到我开始输入“4/1...”然后它才会触发,它甚至都不会触发。我能做些什么来解决这个问题?显然,我可以将 TextBox 绑定(bind)到一个字符串属性,然后更新 setter 中的真实属性,但这有点小技巧。一定有更好的方法...

View 模型

private DateTime _startDate;
public DateTime StartDate
{
get { return _startDate; }
set
{
_startDate = value;
OnPropertyChanged("StartDate");
}
}

看法
<TextBox Text="{Binding Path=StartDate, 
UpdateSourceTrigger=PropertyChanged,
ValidatesOnDataErrors=true}"/>

最佳答案

这取决于您希望在文本框内容不是有效的 DateTime 时发生什么。空字符串无法解析为 DateTime,因此当您清除文本框时,WPF 不知道将什么值推回绑定(bind)源,因此它不执行任何操作,并且您的 setter 不会得到跑。一旦您键入的内容足够可解析,WPF 就会与程序一起并再次开始更新,因此您的 PropertyChanged 事件将再次开始触发。因此,您需要做的第一件事是确定当文本为空或不可解析时所需的 DateTime 值。

完成后,您可以创建一个 IValueConverter:

// Simplified, ignoring error checking, etc.
public class DateTimeConverter : IValueConverter
{
// For source -> target (DateTime -> string) conversion
public object Convert(object value...)
{
return value.ToString(); // ignoring culture, date-time format, etc.
}

// For target -> source (string -> DateTime) conversion
public object ConvertBack(object value...)
{
string str = (string)value;
DateTime dt = GetDateTimeFromMaybePartialString(str); // your logic here
return dt;
}
}

并将其插入绑定(bind):
<Window.Resources>
<local:DateTimeConverter x:Key="dtc" />
</Window.Resources>

<TextBox Text="{Binding Path=StartDate,
Converter={StaticResource dtc},
UpdateSourceTrigger=PropertyChanged,
ValidatesOnDataErrors=true}"/>

关于wpf - 更改时 DateTime 属性未触发 PropertyChanged 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2642597/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com