【问题标题】:TextBlock with binding not updated on property change [duplicate]属性更改时未更新绑定的 TextBlock [重复]
【发布时间】:2018-01-16 22:11:37
【问题描述】:

在我的 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 中的值时,(Main)Page 上的 TextBlock 中的值不会更新。

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

可能是什么问题?

【问题讨论】:

  • 数据绑定并不神奇。必须有某种机制来通知数据的消费者数据已更改。 IE。 INotifyPropertyChanged 的实现。请参阅标记的重复项。
  • 现在,我知道了——之前没有意识到这一点。

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


【解决方案1】:

@Patric 您似乎几乎所有事情都做对了,但您忘记了一步。

当属性值发生变化时,是否有任何通知表明您的属性已更新?您需要向 UI 传播一个通知,表明您的 ViewModel 属性已被更改,否则即使 Text Dependency 属性正在主动侦听来自“源”的任何通知(您已将绑定定义为One-Way),您根本没有与它交流任何东西。

您的 ViewModel 应该实现INotifyPropertyChanged 接口,该接口公开PropertyChanged 事件。 属性更改事件将负责传达更新。

private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
{
   if (PropertyChanged != null)
   {
       PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
   }
} 

在您的属性设置器上,您只需调用此方法,该方法将负责调用带有适当事件数据的 PropertyChanged 事件。

编辑:

为了使用CallerMemberName 属性(它允许您获取调用该方法的属性的名称),请使用以下命名空间System.Runtime.CompilerServices

【讨论】:

  • 谢谢,实际上我的 ViewModel 中有这样一个方法,因为我在一个示例中看到过一次,但我没有意识到我必须在 setter 中调用这个方法。我认为在 UWP 中,绑定会以某种方式自己监视属性。
猜你喜欢
  • 1970-01-01
  • 2013-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-24
  • 1970-01-01
  • 2012-07-18
  • 1970-01-01
相关资源
最近更新 更多