在数据绑定完成后,我需要采取一些行动(例如,基于其他单元格使某些单元格只读)。在WinForm DataGridView中,我通常会在DataBindingComplete事件中进行操作。然而,在WPF DataGrid中,我找不到这样的事件。我还能使用什么?
Dispatcher.BeginInvoke(DispatcherPriority.Render, new Action(() => DoSomethingWithGrid()));
有人能解释一下为什么这是必要的吗?
实际上,在处理WPF DataGrid时,我不得不在很多情况下使用Dispatcher才能使它正常工作。为什么?
我想根据行的属性值对它们进行着色,并尝试了许多事件(DataGrid.Initialized
,DataContextChanged
,AddingNewItem
,RowLoaded
等)以及使用 BeginInvoke
,但没有任何效果。后来我发现:
Loaded
该事件成功解决了我的问题,因为它允许我遍历行并按照期望的方式着色。
private void SubjectsList_Loaded(object sender, RoutedEventArgs e)
{
Dispatcher.BeginInvoke(DispatcherPriority.Render, new Action(() => ColorMyRows()));
}
CollorMyRows
看起来与这个很相似:
private void ColorMyRows()
{
DataGridRow row = null;
for (int i = 0; i < SubjectsList.Items.Count; i++)
{
// get one row
row = SubjectsList.ItemContainerGenerator.ContainerFromIndex(i) as DataGridRow;
if (myConditionIsFulfilled)
{
row.Background = Brushes.PaleGoldenrod; // black'n gold baby
row.ToolTip = "This item fulfills the condition.";
}
else
{
row.Background = Brushes.PaleGreen;
row.ToolTip = "This item does not.";
}
}
}
DataContextChanged。
也许你正在使用线程,而datagrid作为所有UI组件并不是线程安全的。
你可以将单元格的只读属性绑定到一个随着模型其他属性变化而变化的属性。 我以前也曾像你一样考虑,但现在更多地关注于模型而非视图。我对DataGrid不感兴趣,但对绑定到列表的数据感兴趣,你可以做同样的事情。 我之前在类似情况下使用过它。
public class Model : INotifyPropertyChanged
{
public bool IsChecked
{
get { return isChecked; }
set
{
isChecked = value;
RaisePropertyChanged("IsChecked");
RaisePropertyChanged("Visibilty");
}
}
public Visibility Visibilty
{
get
{
return IsChecked ? Visibility.Visible : Visibility.Hidden;
}
}
}
这是一个绑定到IsChecked属性的数据网格中的复选框,其他单元格绑定到可见性,对我而言它很有效。希望这可以帮到你。