Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WPF DataGrid数据绑定完成事件在哪里?_Wpf_Events_Datagrid - Fatal编程技术网

WPF DataGrid数据绑定完成事件在哪里?

WPF DataGrid数据绑定完成事件在哪里?,wpf,events,datagrid,Wpf,Events,Datagrid,数据绑定完成后,我需要采取一些措施(例如,基于其他单元格使某些单元格成为只读)。在WinFormDataGridView中,我通常在DataBindingComplete事件中执行此操作。然而,我在WPF DataGrid中找不到这样的事件。我还可以使用什么?DataContextChanged 这就是我发现的:DataContextChanged事件是正确使用的事件。唯一的问题是datagrid还没有完全准备好在这个事件中的代码中使用。但是,如果我像这样使用Dispatcher.BeginIn

数据绑定完成后,我需要采取一些措施(例如,基于其他单元格使某些单元格成为只读)。在WinFormDataGridView中,我通常在DataBindingComplete事件中执行此操作。然而,我在WPF DataGrid中找不到这样的事件。我还可以使用什么?

DataContextChanged

这就是我发现的:DataContextChanged事件是正确使用的事件。唯一的问题是datagrid还没有完全准备好在这个事件中的代码中使用。但是,如果我像这样使用Dispatcher.BeginInvoke,它可以正常工作:

Dispatcher.BeginInvoke(DispatcherPriority.Render, new Action(() => DoSomethingWithGrid()));
有人能解释为什么这是必要的吗


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

可能是您正在使用线程,而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;
            }
        }
}
这是datagrid中绑定到IsChecked属性的复选框,以及绑定到visibility的其他单元格,对我来说很有用。
希望这对您有所帮助。

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

我想根据行的属性值为行着色,我尝试了很多事件(
DataGrid.Initialized
DataContextChanged
AddingNewItem
RowLoaded
等)以及
BeginInvoke
事件,但没有任何效果。然后我发现:

已加载
这个事件起到了作用,因为它允许我遍历我的行,并根据需要为它们着色

private void SubjectsList_Loaded(object sender, RoutedEventArgs e)
{
    Dispatcher.BeginInvoke(DispatcherPriority.Render, new Action(() => ColorMyRows()));
}
CollorMyRows
看起来与TIH非常相似:

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.";
        }
    }
}
private void ColorMyRows()
{
DataGridRow行=null;
对于(int i=0;i

注意:如果将
可观察集合
绑定到
数据网格
,循环中的索引(数据网格
行的索引)将与集合中的索引相对应:)

数据绑定完成后,您希望执行什么操作?如我所述,我想根据同一行上另一列的值禁用某些单元格。这很奇怪。不知何故,DataContextChanged事件对我不起作用。我想做的是根据同一行中另一列的值禁用列中的某些单元格。如果我将代码放在单元格单击事件中,同样的代码也可以工作,但在DataContextChanged事件中不工作。当这个事件被触发时,我感觉DataGrid还没有准备好,这就是我的更新没有生效的原因——只是一个猜测。有什么线索吗?我想你可以用一个IValueConverter和一个样式设置很容易做到这一点。我可以为此写一个示例,但需要几天时间。我不确定样式是否能解决我在这方面的所有问题。在我的WinForm应用程序(我正试图将其转换为WPF)中,使用了大量DataGridView。在DataBindingComplete事件中,我们所做的不仅仅是设置视觉效果。但是风格肯定会帮我省去一些麻烦。@Chris:我对你关于使用IValueConverter和Style的建议很感兴趣。你能给我一些示例代码吗?谢谢此事件可能在数据绑定完成之前触发。请参阅此事件中的重要备注,在数据绑定完成之前可能会触发。参见第页的重要评论