Thomas
Thomas

Reputation: 45

Reference to a element inside a grid in wpf

I have a function which querys the database for Strings (which are x:Name="" in my application)

Following is the code:

 Try
            For Each s In output
                Dim nameOfControl = s
                Dim window = Windows.Application.Current.Windows(0)
                Dim visuals = GetVisualChildren(Of FrameworkElement)(window)
                Dim child = visuals.OfType(Of FrameworkElement)().FirstOrDefault(Function(x) x.Name = nameOfControl)
                child.Visibility = Visibility.Collapsed
            Next


 Public Iterator Function GetVisualChildren(Of T As Visual)(parent As DependencyObject) As IEnumerable(Of T)
    Dim child As T = Nothing
    Dim numVisuals As Integer = VisualTreeHelper.GetChildrenCount(parent)
    For i As Integer = 0 To numVisuals - 1
        Dim v As Visual = DirectCast(VisualTreeHelper.GetChild(parent, i), Visual)
        child = TryCast(v, T)
        If v IsNot Nothing Then
            For Each item In GetVisualChildren(Of T)(v)
                Yield item
            Next
        End If
        If child IsNot Nothing Then
            Yield child
        End If
    Next
End Function

I cannot seem to figure out why this does not work for all elements, ie. my window consists of a TabControl which i can call by "x name", same goes for toolBar, everything works well even with TabItem's but i cannot reference to <Button x:Name="buttonRefresh" which is inside one of TabItem's grids.

I recieve a error NullReferenceException on line bellow:

child.Visibility = Visibility.Collapsed

If i insert a breakpoint at that line i get this {System.Windows.Controls.TabItem Header:FirstTab Content:} for child so i'm asuming i need to change something about this piece of code

Dim window = Windows.Application.Current.Windows(0)

Upvotes: 0

Views: 73

Answers (1)

rory.ap
rory.ap

Reputation: 35318

Your problem is here:

Dim child = visuals.OfType(Of FrameworkElement)().FirstOrDefault(Function(x) x.Name = nameOfControl)

The FirstOrDefault method will return Nothing if the predicate results in False. In your case, it has done so because on the next line, child is null, hence the NRE:

child.Visibility = Visibility.Collapsed

You can't assign to the Visibility property on child because it's Nothing.

Your predicate is Function(x) x.Name = nameOfControl, so there must not be a value in the collection returned by visuals.OfType(Of FrameworkElement)() whose Name property equals nameOfControl.

To address this, you need to debug it and see what's really going on. I would break your statement into two lines:

Dim child = visuals.OfType(Of FrameworkElement)()
Dim match = child.FirstOrDefault(Function(x) x.Name = nameOfControl)

Put a break point on the second line so it breaks before that statement runs. Then look in your locals/autos window (assuming Visual Studio), and see what's actually in the collection.

One other thing to note here: when you compare x.Name to nameOfControl with the equals sign =, it does so in case sensitive manner, so if you have MyName and myname, those two are not equal. You can use this instead if you want it to be compare in a case-insensitive manner:

Function(x) x.Name.Equals(nameOfControl, StringComparison.CurrentCultureIgnoreCase)

Upvotes: 1

Related Questions