Как мне привязать к 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
, чтобы не повредить внешние привязки.