Datagrid在数据更改后未更新

时间:2014-01-05 18:50:44

标签: c# wpf datagrid

我通过DataGrid

将WPF ObservableCollection绑定到dg.ItemsSource = myCollection;

MyClass实现INotifyPropertyChanged。我有一个计算属性,计算为异步。

该属性是一个SolidColorBrush,绑定到Text的颜色。属性值更改后,DataGrid会立即更新,但会更新为soons,因为我选择属性更改的项目行显示更新后的值。

如何让DataGrid立即更新?我不能对ItemsSource使用XAML绑定。

绑定:

<DataGridTextColumn Foreground={Binding Path=MyBrushProperty} />

班级代码:

public class MyClass : INotifyPropertyChanged
{
public SolidColorBrush MyBrushProperty {
   get {
      CalcMyBrush();
      return _myBrushProperty;
   }
  set{
   _myBrushProperty = value; 
   OnPropertyChanged("MyBrushProperty");
  }
}
private void CalcMyBrush(){
   //DoSomething that changes _myBrushProperty and takes some time and needs to run async and after that sets
   MyBrushProperty = somevalue;

}
}

2 个答案:

答案 0 :(得分:1)

我认为在得到异步计算结果后,您需要为计算属性上升PropertyChanged事件。

类似这样的事情

public SolidColorBrush MyBrushProperty{get{return myBrushProperty;}}
private void CalcMyBrush()
{
    var awaiter = YourAsyncCalculation.GetAwaiter();
    awaiter.OnComplited(()=>
    {
     myBrushProperty= (SolidColorBrush)awaiter.GetResult();
     OnPropertyChanged("MyBrushProperty"); 
    });
}

答案 1 :(得分:0)

请注意,您无法从不同的线程更改UI项目(请参阅STA Apartment State)。我们的想法是创建线程是创建项目的单个所有者。 例如,以下代码无益于两个原因: 1. NotifyOfPropertyChange(“MyBrushProperty”);可能会在任务计算之前调用。 2.不太明显的是,任务内容将导致例外情况:

调用线程无法访问此对象,因为另一个线程拥有它。 这里可能有一些问题。

确保打开所有异常标志或探索_myBrushProperty

中的颜色属性
    public class ModuleBMainWindowViewModel : Screen , INotifyPropertyChanged
{
    public ModuleBMainWindowViewModel()
    {
        _myBrushProperty = new SolidColorBrush(Colors.White);
        DisplayName = "ModuleB";
        CalcMyBrush();

    }
    private SolidColorBrush _myBrushProperty;
    public SolidColorBrush MyBrushProperty
    {
        get
        {
            return _myBrushProperty;
        }
        set
        {
            _myBrushProperty = value;
        }
    }
    private void CalcMyBrush()
    {
         Task.Run(() =>
        {
            //DoSomething that changes _myBrushProperty and takes some time and needs to run async and after that sets
            _myBrushProperty = new SolidColorBrush(Colors.Blue);
        });

         NotifyOfPropertyChange("MyBrushProperty");
    }
}