Как использовать привязки WPF с RelativeSource?

Ответ rspeer правильно указывает на то, что unicode-escape подразумевает неявное декодирование с использованием latin-1, но не выполняет его. Если unicode-escape правильно декодирует экраны, но неправильно обрабатывает необработанные байты без ASCII, расшифровывая их как latin-1, то прямое исправление не должно принимать регулярное выражение, а затем перекодировать их как latin-1 после (отменить ошибочная часть процесса), а затем декодировать в правильной кодировке. Например, неправильное использование образца:

>>> s = 'naïve \\t test'
>>> print(s.encode('utf-8').decode('unicode_escape'))
naïve   test

можно сделать тривиально правильным, добавив .encode('latin-1').decode('utf-8'), сделав его:

>>> s = 'naïve \\t test'
>>> print(s.encode('utf-8').decode('unicode_escape').encode('latin-1').decode('utf-8'))
naïve    test
# Or using codecs.decode to replace the first encode/decode pair with a single text->text transform:
>>> print(codecs.decode(s, 'unicode_escape').encode('latin-1').decode('utf-8'))
naïve    test

Конечно, это много назад и вперед, и я бы не хотел его встроить в свой код, но его можно разделить на автономную функцию, которая работает как для str, так и для bytes (с необязательным шагом декодирования для bytes if результат в известной кодировке):

def decode_escapes(s, encoding=None):
    if isinstance(s, str):
        if encoding is not None:
            return TypeError("Do not pass encoding for string arguments")
        # UTF-8 will allow correct interpretation of escapes when bytes form
        # interpreted as latin-1
        s = s.encode('utf-8')
        encoding = 'utf-8'
    decoded = s.decode('unicode_escape').encode('latin-1')
    if encoding is not None:
        # If encoding is provided, or we started with an arbitrary string, decode
        decoded = decode.decode(encoding)
    return decoded

553
задан shekhar 2 October 2015 в 07:46
поделиться

5 ответов

Если Вы хотите связать с другим свойством на объекте:

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

, Если Вы хотите получить свойство на предке:

{Binding Path=PathToProperty,
    RelativeSource={RelativeSource AncestorType={x:Type typeOfAncestor}}}

, Если Вы хотите получить свойство на шаблонном родителе (таким образом, можно сделать 2 пути привязка в ControlTemplate)

{Binding Path=PathToProperty, RelativeSource={RelativeSource TemplatedParent}}

или, короче (это только работает на привязку OneWay):

{TemplateBinding Path=PathToProperty}
741
ответ дан Guge 2 October 2015 в 07:46
поделиться

Не забывайте TemplatedParent:

<Binding RelativeSource="{RelativeSource TemplatedParent}"/>

или

{Binding RelativeSource={RelativeSource TemplatedParent}}
18
ответ дан Bob King 2 October 2015 в 07:46
поделиться
Binding RelativeSource={
    RelativeSource Mode=FindAncestor, AncestorType={x:Type ItemType}
}
...

атрибут по умолчанию RelativeSource Mode свойство. Полный набор допустимых значений дан здесь ( от MSDN):

  • PreviousData Позволяет Вам связывать предыдущий элемент данных (не, которые управляют, который содержит элемент данных) в списке отображаемых элементов данных.

  • TemplatedParent Относится к элементу, к которому шаблон (в который элемент с привязкой к данным существует), применяется. Это подобно установке TemplateBindingExtension и только применимо, если Привязка в шаблоне.

  • Сам Относится к элементу, на котором Вы устанавливаете привязку, и позволяет Вам связывать одно свойство того элемента к другому свойству на том же элементе.

  • FindAncestor Относится к предку в родительской цепочке элемента с привязкой к данным. Можно использовать это для привязки с предком определенного типа или его подклассов. Это - режим, который Вы используете, если Вы хотите определить AncestorType и/или AncestorLevel.

127
ответ дан Drew Noakes 2 October 2015 в 17:46
поделиться

Следует отметить, что для тех, кто спотыкается о Silverlight:

Silverlight предлагает только сокращенное подмножество этих команд

13
ответ дан 22 November 2019 в 22:13
поделиться

Я только что опубликовал другое решение для доступа к DataContext родительского элемента в Silverlight, который работает на меня. Он использует Binding ElementName .

10
ответ дан 22 November 2019 в 22:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: