Windows Phone 8.1:DependencyProperty回调方法只触发一次(在值更改之前,将触发Noti
本文关键字:一次 Noti Phone DependencyProperty 回调 Windows 方法 | 更新日期: 2023-09-27 18:21:00
我已经在Windows Phone 8.1应用程序(而不是SilverLight)中注册了此行为:
public class MessageBoxDisplayBehavior : DependencyObject, IBehavior
{
public string Message
{
get { return (string)GetValue(MessageProperty); }
set { SetValue(MessageProperty, value); }
}
public static readonly DependencyProperty MessageProperty = DependencyProperty.Register("Message", typeof(string), typeof(MessageBoxDisplayBehavior), new PropertyMetadata(string.Empty, OnMessageChanged));
private static void OnMessageChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var msg = e.NewValue as string;
if (!string.IsNullOrEmpty(msg))
{
//this is fired only once, even if I call
}
}
}
Xaml:
<Page
x:Class="Client.Views.PageViewBase"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:Client.Views"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:behaviors="using:Client.Behaviors"
xmlns:i="using:Microsoft.Xaml.Interactivity"
mc:Ignorable="d"
Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<i:Interaction.Behaviors>
<behaviors:MessageBoxDisplayBehavior Message="{Binding MessageBoxMessage}" />
</i:Interaction.Behaviors>
</Page>
继承Caliburn.Micro Screen 的视图模型
public abstract class ViewModelBase : Screen
{
public string MessageBoxMessage
{
get
{
return _messageBoxMessage;
}
set
{
_messageBoxMessage = value;
NotifyOfPropertyChange(() => MessageBoxMessage);
}
}
private string _messageBoxMessage;
}
这里的问题是,当我将viewmodel中的属性MessageBoxMessage设置为值"test"时,就会触发MessageBoxDisplayBehavior类的方法OnMessageChanged。没事。
但是,当我再次将其设置为值"test"时,方法OnMessageChanged不会再次触发(但通知属性已更改,我可以订阅PropertyChanged事件并捕获它)。
当我将值设置为其他值时(例如"test2"),它又开始工作了。
依赖对象是否在内部持有属性的值,并仅在其发生更改时触发更改?我能以某种方式覆盖它吗?
我希望在调用NotifyPropertyChanged时激发DependencyProperty回调方法,即使值没有更改。
如果为属性重新分配相同的值"test",则属性不会更改。
如果您继续为它分配不同的字符串值,它将发生变化。
请记住,这是"属性已更改"。
在您的情况下,您不会更改值。您只是不断提交相同的值,期望得到不同的结果。