Это зависит от того, что вы хотите.Я постараюсь предложить полный ответ.Один из способов гарантировать лучший успех с этим синтаксисом - использовать XAML Binding Builder VS2010 , как я и собирал синтаксис, который вы увидите.
Если вы хотите, чтобы элемент UserControl отображал ваше свойство зависимостей IPAddress, (мне кажется, оно определено правильно), используйте этот синтаксис в теле разметки UserControl:
<TextBlock Text="{Binding RelativeSource={RelativeSource FindAncestor,
AncestorType={x:Type my:GridControl},
AncestorLevel=1},
Path=IPAddress}" />
Большинство примеров связывания XAML используют этот синтаксис, а не более подробный иерархический XML:
<TextBlock>
<TextBlock.Text>
<Binding Path="IPAddress">
<Binding.RelativeSource>
<RelativeSource Mode="FindAncestor"
AncestorType="{x:Type my:GridControl}"
AncestorLevel="1"
/>
</Binding.RelativeSource>
</Binding>
</TextBlock.Text>
</TextBlock>
... но оба вида синтаксиса дают одинаковые результаты. Обратите внимание, что AncestorType
- это имя класса вашего UserControl, а не x:Name
, который вы указали бы при использовании UserControl в другой разметке.
Предположим, у вас естьЭлемент пользовательского интерфейса в разметке вне вашего UserControl, и вы хотите получить доступ к вашему DependencyProperty для этого другого элемента управления .Разметка выглядит примерно так:
<my:GridControl
x:Name="GridControl1" IPAddress="192.168.1.1" />
<TextBox Text="{Binding ElementName=GridControl1, Path=IPAddress}"/>
Или, альтернативно, это:
<TextBox>
<TextBox.Text>
<Binding ElementName="GridControl1" Path="IPAddress"/>
</TextBox.Text>
</TextBox>
Обратите внимание, что на этот раз вы используете свойство x:Name
объектаGridControl, а не имя класса, и то, что вы называете его ElementName
, а не "Ancestor". В обоих случаях Path
является объявленным именем свойства DependencyProperty, которое вы определили.