tags:

views:

38

answers:

2

In good old (well!!) WinForms days the datagrids row used to the be the actual control and you could then access the DataItem.

In WPF its all flipped and dataGrid.Items is just the source data.

I am probably doing this the wrong way round as im a bit of a WPF newb but how can I iterate through the rows of my gridview grabbing the values from certain labels, textboxes etc?

A: 

Yes, you are doing this the wrong way round. What you should be doing is iterating through the items in your data source - it's where all the values are, after all.

It's possible to iterate through the WPF objects, but it's not trivial. And there's a significant problem that you'll run into if you try.

You can use the VisualTreeHelper class to search the visual tree and find the DataGrid's descendant objects. If you play with this long enough, eventually you'll figure out how to find the specific controls you're looking for. But the DataGrid (actually, the VirtualizingStackPanel in its control template) virtualizes its visual children. If an item hasn't appeared on the screen yet, its WPF objects haven't been created yet, and you won't find them in the visual tree. You may not be able to find what you're looking for, not because you don't have a way of finding it, but because it doesn't exist.

If you're using value converters and formatting in your bindings (which is the only reason I can think of that you'd want to look at the WPF objects and not the underlying data items), I'm afraid the answer is: don't do that. Do the value conversion and formatting in your data source, and expose the results as properties that can be bound to directly.

It's certainly possible to use WPF without using the MVVM pattern. But this is the kind of brick wall that you can run into if you don't.

Robert Rossney
A: 

You can use this

    public DataGridRow TryFindRow(object item, DataGrid grid)
    {
        // Does not de-virtualize cells
        DataGridRow row = (DataGridRow)(grid as ItemsControl).ItemContainerGenerator.ContainerFromItem(item);

        return row;
    }

where item represent the data displayed on the row. Hope this helps.

Nidal Valot