我有一个像这样的依赖属性的简单控件
public class StatusProgress : Control
{
public string Text
{
get { return (string)GetValue(TextProperty); }
set { SetValue(TextProperty, value); }
}
public static readonly DependencyProperty TextProperty =
DependencyProperty.Register("Text", typeof(string), typeof(StatusProgress),
new FrameworkPropertyMetadata(null, (d, e) => (d as StatusProgress).TextUpdated(e.OldValue as string)));
private void TextUpdated(string text)
{
Trace.WriteLine("test");
}
}
然后我有查看模型
public class ViewModelPageAnalyse : ViewModelPageBase
{
private string _progressText;
public string ProgressText
{
get { return _progressText; }
set
{
_progressText = value;
OnPropertyChanged(); // base class INotifyPropertyChanged implementation
}
}
}
然后有一个用户控件(显示在带ContentControl
的窗口中)。用户控件必须使用数据模板查看模型(这可能很重要)
<DataTemplate DataType="{x:Type local:ViewModelPageAnalyse}">
<local:UserControlAnalyse/>
</DataTemplate>
这是用户控制中的控件
<local:StatusProgress Text="{Binding ProgressText}"/>
现在有趣的部分。当设置/更改视图模型中的ProgressText
时,将调用属性更改的回调两次。我在调试器输出窗口中看到两次"test"
。
更有趣的是:当视图发生变化时,由于某些原因,再次使用e.NewValue = null
调用回调,而没有任何内容直接将ProgressText
设置为null
。
我已经尝试在上升事件之前检查ProgressText
setter中的值是否已更改,尝试单向设置绑定模式,问题仍然是 - 使用相同值调用两次回调,调用堆栈看起来相同,但是在wpf中真的有很多电话要确定。
虽然双击不是一个真正的问题,但它让我感到困扰。具有null
值的回调是我真正的问题(我认为它们是相关的)。谁知道出了什么问题?
找到第一个问题的原因:它是Content
的其他控件。在转换期间,它创建了一个新的Model
(因为Content
是ViewModel
),而不是重新分配现有的用户控件。完全是我的错。第二个问题仍然存在,我发现this问题(解决方法不适合我)。
需要帮助
当ContentControl ViewModel发生更改时,将使用默认值调用PropertyChanged回调。
在我的情况下,null
代表Text
。任何人?我无法弄清楚它为何被称为。如果我可以这么说的话,我的猜测由DataTemplate
经理调用。
答案 0 :(得分:-1)
尝试更改此行:
public static readonly DependencyProperty TextProperty =
DependencyProperty.Register("Text", typeof(string), typeof(StatusProgress),
new FrameworkPropertyMetadata(null, (d, e) => (d as StatusProgress).TextUpdated(e.OldValue as string)));
用这个:
public static readonly DependencyProperty TextProperty =
DependencyProperty.Register("Text", typeof(string), typeof(StatusProgress)
, new PropertyMetadata(""));