在我的UWP应用程序中,我有一个TextBlock,它应该显示一个(格式化的)日期,该日期绑定到视图模型中的属性:
<TextBlock Style="{StaticResource summaryTextStyleHighlight}" Margin="0,10,0,0"
Text="{x:Bind ViewModel.CurrentDisplayDay, Converter={StaticResource DateFormatConverter}, ConverterParameter=d, Mode=OneWay}"
Name="lblCurrentDate" />
转换器在XAML中“配置”,如下所示:
<local:DateFormatConverter x:Key="DateFormatConverter" />
转换器类如下:
public class DateFormatConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, string language)
{
if (value == null)
return null;
DateTime dt = DateTime.Parse(value.ToString());
if (parameter != null)
{
return dt.ToString((string)parameter, Utils.GetCurrentCultureInfo());
}
return dt.ToString("g", Utils.GetCurrentCultureInfo());
}
public object ConvertBack(object value, Type targetType, object parameter, string language)
{
throw new NotImplementedException();
}
}
ViewModel具有绑定的DateTime值的简单属性:
public DateTime CurrentDisplayDay
{
get;
private set;
}
但是当我更新ViewModel中的值时,该值将不会在(主)页面上的TextBlock中更新。
我试图将该属性移动到该页面,但这没有帮助。如果我刷新页面(再次导航到它),则显示更新的值,但我不想导航到它,它应该通过绑定显示更新的值。
可能是什么问题?
答案 0 :(得分:2)
@Patric你似乎正在做几乎所有事情,但你已经忘记了一步。
当其值发生变化时,是否有任何通知表明您的财产已更新?您需要向UI传播通知,指示您的ViewModel属性已被更改,否则即使Text Dependency属性正在主动侦听来自&#34; source&#34; (您已将绑定定义为One-Way
),您根本就没有与之通信。
您的ViewModel应实现INotifyPropertyChanged
接口,该接口公开PropertyChanged
事件。
属性更改事件将负责传达更新。
private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
在属性设置器上,您只需调用此方法,该方法将负责使用适当的事件数据调用PropertyChanged事件。
为了使用CallerMemberName
属性(允许您获取调用该方法的属性的名称),请使用以下命名空间System.Runtime.CompilerServices