StatusBar并不总是更新

问题描述

| 我是MVVM的新手,我正在尝试为MVVM WPF应用程序编写基本的状态栏。我认为我有主旨,但是由于某些原因,状态栏并不总是更新,我不确定为什么。 在我的viewmodel中,我有一个基本属性,可以在更改状态消息时进行更新:
public string StatusMessage
{
    get { return _statusMessage; }
    set
    {
        if (value == _statusMessage) return;
        _statusMessage = value;
        base.OnPropertyChanged(() => this.StatusMessage);
    }
}
我的OnPropertyChanged方法(我在实现INotifyPropertyChanged的基本viewmodel类中拥有)看起来像这样(从Gunther Foidl那里得到了这个主意;希望我可以称赞它,因为我认为它很漂亮,但是我不完全是这样)聪明):
protected virtual void OnPropertyChanged<T>(Expression<Func<T>> exp)
    {
    MemberExpression me = exp.Body as MemberExpression;
    string propName = me.Member.Name;

    PropertyChangedEventHandler handler = this.PropertyChanged;
    if (handler != null)
    {
        handler(this,new PropertyChangedEventArgs(propName));
    }
}
无论如何,这一切对我所有的控件(一个除外)都非常有效。在我的MainWindow.xaml文件上,我有一个StatusBarItem控件绑定到上述属性,就像这样(由于空间原因,XAML的其余部分已被裁剪):
<StatusBarItem Grid.Column=\"0\">
    <TextBlock TextTrimming=\"CharacterEllipsis\" Text=\"{Binding Path=StatusMessage}\" />
</StatusBarItem>
当我运行我的应用程序时(除了从模板生成文档以及大量其他相当耗费资源的文件之外,还击中了几个数据库),状态栏中会显示一些(但不是全部)消息。我已经调试并验证了消息全部都进入了上面的StatusMessage属性(以及随后的私有变量),它们似乎在UI中似乎没有刷新。 我看过几个使用BackgroundWorker实例用于ProgressBar控件的示例,但还没有看到用于StatusBarItem控件的示例,并且不确定如何将它们相互转换。 我之前在以前的C#4.0和WPF应用程序中也使用过Tasks,并认为这可能是一个不错的方法,但是我还没有真正弄清楚如何/在何处指定UI任务(I \以前总是在MainWindow的代码隐藏区中做到这一点,但我正在努力在代码后面隐藏零以与MVVM保持一致。 我非常确定采用多线程方法是可行的。我只是不太了解一种方法(我对此有点了解)。我确实看到了几篇直接使用较旧的线程方法文章,但是直到我开始在.NET 4.0中使用Tasks时(我发现它们更容易理解和跟踪),我几乎不参与多线程编程。弄明白它们有点麻烦。 谁能同情我并指出正确的方向,或者建议我可以做进一步的调试?谢谢!     

解决方法

        1)有时由于内联,基于反射的绑定可能是错误的来源。尝试查看如果使用简单字符串而不是反射来通知属性已更改,将会发生什么。 2)如果您正在使用多线程,则可能无法通过UIThread设置StatusMessage的情况下将无法更新UI,则可以在UI Dispatcher上调用setter代码以查看是否有帮助 3)检查绑定是否有效,在xaml形式的构造函数中直接在VM上修改StatusMessage并查看是否在UI上显示更改,而无需调用将额外变量引入简单文本块-字符串绑定的多线程服务调用 4)如果这样做没有帮助,您可以使用单个文本块创建一个简单的xaml表单,将其绑定到您的大viewmodel上,看看会发生什么,如果没有任何效果,您可以开始切割VM类以使其更简单,从而使绑定最终开始起作用,并且你发现一个错误 5)如果您认为状态栏是问题,请查看不带状态栏的单个文本块(从示例中提取xaml部分)是否有效     ,        通知无法通过的地方。 我会尝试 : 在文本绑定上添加一个哑数值转换器,以便您可以设置断点并查看是否被调用 调度属性集以在“更好”的时间设置值-这有时是必要的。 调度集合可能会成功。     

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...