C# 属性更改时未更新具有绑定的TextBlock
在我的UWP应用程序中,我有一个文本块,它应该显示一个(格式化的)日期,该日期绑定到视图模型中的属性: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
<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));
}
}