WPF绑定到TextBlock不会立即更新目标

WPF绑定到TextBlock不会立即更新目标,wpf,binding,Wpf,Binding,我不认为我的问题已经落在这里的任何其他人身上,所以希望有人能帮助我 我使用INotifyPropertyChnaged设置了一个文本块绑定,它确实有效。我遇到的问题是当它更新目标控件(TextBlock)时 我的代码的快速运行 namespace XYZ { public partial class Loading : Window { StatusMessage msg = StatusMessage.GetInstance(); public

我不认为我的问题已经落在这里的任何其他人身上,所以希望有人能帮助我


我使用INotifyPropertyChnaged设置了一个文本块绑定,它确实有效。我遇到的问题是当它更新目标控件(TextBlock)时

我的代码的快速运行

namespace XYZ
{
    public partial class Loading : Window
    {
        StatusMessage msg = StatusMessage.GetInstance();

        public loading()
        {
            InitializeComponent();
            this.DataContext = msg;
        }

        private void LoadBackEndUsers()
        {

            msg.Status = "Loading Users";

            //txtStatus.GetBindingExpression(TextBlock.TextProperty).UpdateTarget();
            //lblLoading.Focus();
            this.txtStatus.DataContext = msg;

            beUsers = new BackendUsers(Database);
            allBEUsers = beUsers.GetAllUsers();
        }

        private void LoadProducts()
        {
            msg.Status = "Loading Products";

            //txtStatus.GetBindingExpression(TextBlock.TextProperty).UpdateTarget();
            //lblLoading.Focus();
            this.txtStatus.DataContext = msg;

            products = new Product(Database);
            allProducts = products.GetAllProducts();
         }

         private void Window_ContentRendered(object sender, EventArgs e)
         {           
             LoadBackEndUsers();          
             LoadProducts();
         }
    }
}
现在我的问题是,我的textblock仅在LoadProducts()方法完成后才显示“加载产品”。它根本不显示“正在加载用户”,因此目标仅在所有操作完成后更新

如何让它立即更新。被注释掉的部分是我在尝试各种事情来强制更新

任何帮助都将不胜感激

亲切问候,

Neill

您的
StatusMessage
类应实现:

编辑:我非常确定您的
窗口内容呈现
eventhanler会阻止每次UI更新。我写了一个适合我的小样本:

公共部分类主窗口:窗口
{
StatusMessage msg=新的StatusMessage();
公共主窗口()
{
初始化组件();
this.DataContext=msg;
}
私有void LoadBackEndUsers()
{
Task.Factory.StartNew(()=>
{
this.Dispatcher.BeginInvoke(newthreadstart(()=>msg.Status=“正在加载用户”)、DispatcherPriority.Normal;
//在此处加载用户:
《睡眠》(2000年);
this.Dispatcher.BeginInvoke(newthreadstart(()=>msg.Status=“Users loaded”)、DispatcherPriority.Normal;
//如果用户加载启动加载产品:
LoadProducts();
});
}
私有void LoadProducts()
{
Task.Factory.StartNew(()=>
{
this.Dispatcher.BeginInvoke(newthreadstart(()=>msg.Status=“装入产品”)、DispatcherPriority.Normal;
//在此处加载产品:
《睡眠》(2000年);
this.Dispatcher.BeginInvoke(newthreadstart(()=>msg.Status=“Products Loaded”)、DispatcherPriority.Normal;
});
}
私有无效窗口\u ContentRendered(对象发送方,事件参数e)
{
LoadBackEndUsers();
//LoadProducts();
}
}
您的
状态消息
类应实现:

编辑:我非常确定您的
窗口内容呈现
eventhanler会阻止每次UI更新。我写了一个适合我的小样本:

公共部分类主窗口:窗口
{
StatusMessage msg=新的StatusMessage();
公共主窗口()
{
初始化组件();
this.DataContext=msg;
}
私有void LoadBackEndUsers()
{
Task.Factory.StartNew(()=>
{
this.Dispatcher.BeginInvoke(newthreadstart(()=>msg.Status=“正在加载用户”)、DispatcherPriority.Normal;
//在此处加载用户:
《睡眠》(2000年);
this.Dispatcher.BeginInvoke(newthreadstart(()=>msg.Status=“Users loaded”)、DispatcherPriority.Normal;
//如果用户加载启动加载产品:
LoadProducts();
});
}
私有void LoadProducts()
{
Task.Factory.StartNew(()=>
{
this.Dispatcher.BeginInvoke(newthreadstart(()=>msg.Status=“装入产品”)、DispatcherPriority.Normal;
//在此处加载产品:
《睡眠》(2000年);
this.Dispatcher.BeginInvoke(newthreadstart(()=>msg.Status=“Products Loaded”)、DispatcherPriority.Normal;
});
}
私有无效窗口\u ContentRendered(对象发送方,事件参数e)
{
LoadBackEndUsers();
//LoadProducts();
}
}

问题在于,您的数据检索与UI逻辑发生在同一线程上。这意味着,即使您更改了属性值并提高了OnPropertyChanged,在阻塞数据访问完成之前,也不会重新计算它。相反,您应该使用后台工作人员。下面是一篇很好的文章,介绍了如何使用它:


问题在于,您的数据检索与UI逻辑发生在同一线程上。这意味着,即使您更改了属性值并提高了OnPropertyChanged,在阻塞数据访问完成之前,也不会重新计算它。相反,您应该使用后台工作人员。下面是一篇很好的文章,介绍了如何使用它:


“我使用INotifyPropertyChnaged设置了一个TextBlock绑定,它确实可以工作。我遇到的问题是当它更新目标控件(TextBlock)时”-我确实说过这一点,我确实提到了绑定可以工作,我只是不知道为什么它在设置消息后不立即更新。Status=“blah”@尼尔:好的,我需要去看医生检查一下我的眼睛对不起,没问题,对不起,我的反应有些不稳定,这简直快把我逼疯了@尼尔编辑了我的答案。我希望它能帮到你。tx Ben,今晚晚些时候会检查一下,让你知道“我用INotifyPropertyChnaged设置了一个TextBlock绑定,它确实可以工作。我遇到的问题是当它更新目标控件(TextBlock)时”-我说过了,我提到了绑定工作,我只是不知道为什么在设置msg.Status=“blah”之后它不会立即更新@尼尔:好的,我需要去看医生检查一下我的眼睛对不起,没问题,对不起,我的反应有些不稳定,这简直快把我逼疯了@尼尔编辑了我的答案。我希望它能帮到你。tx Ben,今晚晚些时候会检查一下,让你知道这不会解决你的问题,但是如果你的绑定真的工作正常,我认为你不应该每次更改msg时都重置这个.txtStatus的DataContext。是的,实际上,我只是用它来强制更新以进行测试,并不是说这会解决您的问题,但如果您的绑定确实工作正常,我认为您不应该每次更改msg时都重置此.txtStatus的DataContext。是的,我只是用它来强制更新testingtx Matt,我想是这样的,我会查看链接,看看我能做些什么