绑定 - 回调被调用两次

时间:2014-07-15 13:42:22

标签: c# wpf mvvm binding callback

我有一个像这样的依赖属性的简单控件

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(因为ContentViewModel),而不是重新分配现有的用户控件。完全是我的错。第二个问题仍然存在,我发现this问题(解决方法不适合我)。

需要帮助

  

当ContentControl ViewModel发生更改时,将使用默认值调用PropertyChanged回调。

在我的情况下,null代表Text。任何人?我无法弄清楚它为何被称为。如果我可以这么说的话,我的猜测由DataTemplate经理调用。

1 个答案:

答案 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(""));