WPF DataGrid DataBindingComplete事件在哪里?

时间:2010-10-01 02:15:39

标签: wpf events datagrid

在数据双向完成后,我需要采取一些措施(例如,根据其他一些单元格使一些单元格成为只读)。在WinForm DataGridView中,我曾经在DataBindingComplete事件中执行此操作。但是,我在WPF DataGrid中找不到这样的事件。我还能用什么呢?

6 个答案:

答案 0 :(得分:6)

这就是我想到的:DataContextChanged事件是要使用的正确事件。唯一的问题是数据网格还没有准备好在我的代码中使用此事件。但是,如果我像这样使用Dispatcher.BeginInvoke它可以正常工作:

Dispatcher.BeginInvoke(DispatcherPriority.Render, new Action(() => DoSomethingWithGrid()));

有人可以解释为什么这是必要的吗?

实际上,在处理WPF DataGrid时,我必须在很多情况下使用Dispatcher才能使它工作。为什么呢?

答案 1 :(得分:1)

DataContextChanged仅。

答案 2 :(得分:1)

可能是您正在使用线程,而datagrid与所有UI组件一样不是线程安全的。

答案 3 :(得分:1)

我想根据其属性值为我的行着色,我尝试了很多事件(DataGrid.InitializedDataContextChangedAddingNewItemRowLoaded等等。使用BeginInvoke的东西,但没有任何效果。然后我发现:

Loaded

这个事件起到了作用,因为它允许我遍历我的行并按照我想要的颜色着色。

private void SubjectsList_Loaded(object sender, RoutedEventArgs e)
{
    Dispatcher.BeginInvoke(DispatcherPriority.Render, new Action(() => ColorMyRows()));
}

CollorMyRows看起来与tihs非常相似:

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.";
        }
    }
}

注意:如果ObservableCollection绑定到DataGrid,则循环中的索引(DataGrid行的索引)将对应到集合中的索引:)

答案 4 :(得分:0)

您可以将readonly属性绑定到属性,该属性会在模型的其他属性发生更改时发生更改。 我之前的想法与你完全一样,但我开始在模型中考虑更多,而不是对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属性的数据网格中的一个复选框,其他单元格被限制为可见性,它对我有用。 希望这对你有帮助。

答案 5 :(得分:0)

您可以声明BackgroundWorker并尝试在DoWork事件中填充GridView并在RunWorkerCompleted事件中编写代码