我通过DataGrid
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;
}
}
答案 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");
}
}