Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How does binding elementname work exactly?

Tags:

c#

binding

wpf

xaml

I remember reading a couple of weeks ago that it sometimes doesn't work inside templates, and I recently tried to bind things in two different windows and it couldn't find the name declarations, so I assumed that it was local to the namespace of the class and just bound by setting the datacontext instead. However, I'm really curious when I am able to use binding elementname and when I cannot, because it's far more convenient when it is possible.

edit: In reading that article, I found this to be interesting:

"For this reason, styles and templates both define their own XAML namescopes, independent of whatever location in an object tree where the style or template is applied."

if this is true, doesn't that mean that Binding ElementName should not work in templates at all? But then I definitely have some working bindings on ElementName within my templates. That is the most confusing part, why do some bindings randomly work inside the templates and others do not? It must have some method for trying to resolve the name even if it isn't in the template or same namescope

like image 726
James Joshua Street Avatar asked Aug 22 '13 19:08

James Joshua Street


People also ask

How does the binding work?

A binding specifies what aspect of one object should be bound to what property in another, such that a change in either is reflected in the other. For a given binding, an object therefore records the target object for the binding, the associated key path, and any options that were specified.

How does WPF binding work?

Data binding is a mechanism in WPF applications that provides a simple and easy way for Windows Runtime apps to display and interact with data. In this mechanism, the management of data is entirely separated from the way data. Data binding allows the flow of data between UI elements and data object on user interface.

What is binding why binding of data is necessary?

Data binding is the process that establishes a connection between the app UI and the data it displays. If the binding has the correct settings and the data provides the proper notifications, when the data changes its value, the elements that are bound to the data reflect changes automatically.

What is binding in XAML?

Advertisements. Data binding is a mechanism in XAML applications that provides a simple and easy way for Windows Runtime Apps using partial classes to display and interact with data. The management of data is entirely separated from the way the data is displayed in this mechanism.


1 Answers

Basically you need to be in the same name scope (read this). Most UI elements are in the same tree sharing the same name scope, however there can be breaks and barriers (styles/templates) and if you have abstract objects like DataGrid columns they do not have a name scope at all.

I've been working with WPF long enough to guess when i'll run into problems and i know common areas but don't think there's an easy way to tell in all situations up-front.


if this is true, doesn't that mean that Binding ElementName should not work in templates at all? But then I definitely have some working bindings on ElementName within my templates.

Within is just fine, that is the same scope. The point here is that if you apply the template and they would not have their own scopes there would be conflicts.

e.g.

<Button/>
<Button/>

If we expand the ControlTemplate you would get something like:

<Border Name="bd" Background="{TemplateBinding Background}">...</Border>
<Border Name="bd" Background="{TemplateBinding Background}">...</Border>

Obviously we would get a name conflict.

Same for DataTemplates in ItemsControls, if you name controls in the template that name would conflict with the same control instance in the applied template of other items.


On another note, you can bind from inside a template to the outside because logically there can only be one instance with that name or you can give them a distinct precedence based on how "close" the name scope is, e.g.

<TextBox Name="tb" Text="Test"/>
<ItemsControl ItemsSource="ABC">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Text, ElementName=tb}"/>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>
like image 198
H.B. Avatar answered Sep 27 '22 11:09

H.B.