Как мне привязать к RelativeSource Self?

Я пытаюсь связать несколько разных свойств в моем Xaml:

<Label Content="{Binding Description}" 
Visibility="{Binding Path=DescriptionVisibility, 
ElementName=_UserInputOutput}"               
FontSize="{Binding Path=FontSizeValue, ElementName=_UserInputOutput}"  
HorizontalAlignment="Left" VerticalAlignment="Top" Padding="0" />

Вы заметили, что я использовал два разных метода привязки здесь. Те, кто использует Element Name, работают, а другой нет. Вот код позади:

public string Description
{
     get { return (string)GetValue(DescriptionProperty); }
     set { SetValue(DescriptionProperty, value); }
}
public static readonly DependencyProperty DescriptionProperty = 
DependencyProperty.Register("Description", typeof(string), typeof(UserControl), 
new UIPropertyMetadata(""));

Каждая привязка имеет другое имя, но все они выглядят как по большей части. Я хочу, чтобы моя привязка могла работать с:

{Binding Description}

Вместо:

{Binding Path=Description, ElementName=_UserInputOutput}

Кажется, что он работает только при использовании ElementName. Мне нужно экспортировать/импортировать этот XAML, поэтому я не могу иметь ElementName или импорт не будет работать.

Я думал, что это будет лучше всего:

{Binding Path=Description, RelativeSource={RelativeSource Self}}

Это не сработало.

Любые идеи? Спасибо!

Ответ 1

Вы не установили DataContext, который использует RelativeSource, чтобы определить, к чему это относится. Вам необходимо установить DataContext на более высокий уровень, например UserControl. Я обычно имею:

<UserControl ... DataContext="{Binding RelativeSource={RelativeSource Self}}">
</UserControl>

Это указывает UserControl привязать себя к классу в коде.

Ответ 2

{RelativeSource Self} задает объект, которому принадлежит связанное свойство, если у вас есть такая привязка на Label, он будет искать Label.Description, которого нет. Вместо этого вы должны использовать {RelativeSource AncestorType=UserControl}.

Привязки без источника (ElementName, Source, RelativeSource) относятся к DataContext, однако в UserControls вы должны избегать установки DataContext, чтобы не повредить внешние привязки.