Подтвердить что ты не робот

Различия между ElementName = "<Me>" и RelativeSource self?

В чем разница между созданием связующего самореферентного имени по имени или самореферентом через RelativeSource?

Например:

<!-- Self referential via name -->
<Window ...
    x:Name="This"
    DataContext="{Binding Path=Data, ElementName=This}"/>

против

<!-- Self referential via RelativeSource -->
<Window ...
    x:Name="This"
    DataContext="{Binding Path=Data, RelativeSource={RelativeSource Self}}"/>

В моем проекте они, похоже, ведут себя одинаково, но я использую их непосредственно в окне. Это означает, что я сразу предпочитаю первое, потому что это меньше набирает текст.

Единственное преимущество RelativeSource в его способности быть самореференциальным в (например) широко используемом стиле? Или есть какая-то дополнительная смысловая разница?

4b9b3361

Ответ 1

Предостережение: мастер WPF

Когда вы привязываетесь непосредственно к элементу WPF, как в вашем примере, нет никакой разницы. "This" разрешима и будет привязываться к тому же элементу, что и Self.

Мое подозрение - это разница, когда вы привязываетесь к конструкциям, таким как стиль. В этом случае то, что вы на самом деле хотите связать, - это элемент, к которому применяется стиль. В этом случае RelativeSource Self предоставит вам тот элемент, где "This" просто даст вам экземпляр Style.

Ответ 2

Если вы склонны реорганизовывать имена своих элементов управления, то использование саморефессиональной формы может быть более желательным, иначе я бы сказал, что это вызов, который я бы сделал на основе производительности. Постройте небольшой тест и посмотрите, какой тип привязки лучше работает, и выберите его. Если разница в производительности пренебрежимо мала, я бы определенно принял во внимание другие соображения совместимости, такие как общий внешний вид и время ввода. Также не забывайте, что при использовании собственной ссылочной формы вам не нужно указывать свой элемент, поэтому вам нужно включить это дополнительное требование именования для формы ElementName при сравнении того, как много печатается и переключается контекст между мышью и клавиатурой.

Лично я предпочитаю ссылочные формы привязки, когда это имеет смысл в целях упрощения рефакторинга и того факта, что мне не нужно перемещать свой документ XAML, чтобы добавить имя элемента при настройке привязки.

Ответ 3

Почему вы думаете, что между ними есть разница? Я думаю, что они должны быть одинаковыми, поскольку они являются двумя способами обращения к одному и тому же элементу.