0

I have the following very simple WPF application:

A User control: XAML:

<UserControl x:Class="WPFUserControlTest.TestControl"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         xmlns:local="clr-namespace:WPFUserControlTest"
         mc:Ignorable="d" 
         d:DesignHeight="450" d:DesignWidth="800"
         x:Name="root">
<Grid>
    <TextBlock Text="{Binding ElementName=root, Path=InputString}"/>
</Grid>

Code Behind:

namespace WPFUserControlTest
{
    public partial class TestControl : UserControl
    {
        public TestControl()
        {
            InitializeComponent();
        }

        public string InputString
        {
            get { return (string)GetValue(InputStringProperty); }
            set { SetValue(InputStringProperty, value); }
        }

        public static readonly DependencyProperty InputStringProperty =
            DependencyProperty.Register("InputString", typeof(string), typeof(TestControl), new PropertyMetadata(""));
    }
}

My Main Window:

<Window x:Class="WPFUserControlTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WPFUserControlTest"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <StackPanel>
        <local:TestControl x:Name="Mercedes" InputString="Mercedes"/>
        <local:TestControl InputString="Volvo"/>
        </StackPanel>
    </Grid>
</Window>

What i wonder is how it can be that the binding inside the user control that uses ElementName seems to work even though the main window changes the name of the control. Is this binding done internally in the control somehow at compile time?

When i look at this is in the Live Visual Tree I see that one of my control instances has name "root" and one is named "mercedes". Still both of them works as expected...

Fred
  • 187
  • 5
  • 23
  • Alternative Binding: ``. It avoids the need for `x:Name="root"` and the associated generated field. – Clemens Sep 12 '19 at 09:21

1 Answers1

1

You should read up on XAML namescopes. The name "Mercedes" is only applicable in the namescope of the window and "root" in the namescope of the UserControl.

The window cannot refer to the UserControl as "root" because it doesn't belong to the same namescope.

mm8
  • 163,881
  • 10
  • 57
  • 88