带有绑定的TextBlock未在属性更改时更新

时间:2018-01-16 22:11:37

标签: c# data-binding uwp dependency-properties uwp-xaml

在我的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中更新。

我试图将该属性移动到该页面,但这没有帮助。如果我刷新页面(再次导航到它),则显示更新的值,但我不想导航到它,它应该通过绑定显示更新的值。

可能是什么问题?

1 个答案:

答案 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