Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 属性更改时未更新具有绑定的TextBlock_C#_Data Binding_Uwp_Dependency Properties_Uwp Xaml - Fatal编程技术网

C# 属性更改时未更新具有绑定的TextBlock

C# 属性更改时未更新具有绑定的TextBlock,c#,data-binding,uwp,dependency-properties,uwp-xaml,C#,Data Binding,Uwp,Dependency Properties,Uwp Xaml,在我的UWP应用程序中,我有一个文本块,它应该显示一个(格式化的)日期,该日期绑定到视图模型中的属性: <TextBlock Style="{StaticResource summaryTextStyleHighlight}" Margin="0,10,0,0" Text="{x:Bind ViewModel.CurrentDisplayDay, Converter={StaticResource DateFormatConverter}, Conve

在我的UWP应用程序中,我有一个文本块,它应该显示一个(格式化的)日期,该日期绑定到视图模型中的属性:

    <TextBlock Style="{StaticResource summaryTextStyleHighlight}" Margin="0,10,0,0"
               Text="{x:Bind ViewModel.CurrentDisplayDay, Converter={StaticResource DateFormatConverter}, ConverterParameter=d, Mode=OneWay}"
               Name="lblCurrentDate" />
ViewModel对绑定的DateTime值有一个简单属性:

public DateTime CurrentDisplayDay
{
    get;
    private set;
}
但是当我更新ViewModel中的值时,该值不会在(主页)上的文本块中更新

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


有什么问题吗?

@Patric你似乎做的每件事都很正确,但你忘记了一步

当您的属性值发生更改时,是否有任何通知表明您的属性已更新?您需要向UI传播一个通知,指示您的ViewModel属性已被更改,因为否则,即使文本依赖项属性正在积极侦听来自“源”的任何通知(您已将绑定定义为“单向”),您也不会与它进行任何通信

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

private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
{
   if (PropertyChanged != null)
   {
       PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
   }
} 
在属性设置器上,只需调用此方法,该方法将负责使用适当的事件数据调用PropertyChanged事件

编辑:
为了使用
CallerMemberName
属性(它允许您获取调用该方法的属性的名称),请使用以下命名空间
System.Runtime.CompilerServices
@Patric您似乎做得几乎所有事情都正确,但您忘记了一个步骤

当您的属性值发生更改时,是否有任何通知表明您的属性已更新?您需要向UI传播一个通知,指示您的ViewModel属性已被更改,因为否则,即使文本依赖项属性正在积极侦听来自“源”的任何通知(您已将绑定定义为“单向”),您也不会与它进行任何通信

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

private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
{
   if (PropertyChanged != null)
   {
       PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
   }
} 
在属性设置器上,只需调用此方法,该方法将负责使用适当的事件数据调用PropertyChanged事件

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

数据绑定不是魔术。必须有某种机制来通知数据消费者数据已更改。即,
INotifyPropertyChanged
的实现。看标记的重复。现在,我知道了-以前没有意识到。数据绑定不是魔术。必须有某种机制来通知数据消费者数据已更改。即,
INotifyPropertyChanged
的实现。请参阅标记的重复。现在,我知道-以前没有意识到。谢谢,我实际上在我的ViewModel中有这样一个方法,因为我在一个示例中看到过一次,但我没有意识到我必须在setters中调用此方法。我认为在UWP中绑定会以某种方式观察属性本身。谢谢,我实际上在我的ViewModel中有这样一个方法,因为我在一个示例中看到过一次,但我没有意识到我必须在setters中调用这个方法。我认为在UWP中,绑定会以某种方式监视属性本身。
private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
{
   if (PropertyChanged != null)
   {
       PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
   }
}