Ответ 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
Если Вы хотите связать с другим свойством на объекте:
{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}
Не забывайте TemplatedParent:
<Binding RelativeSource="{RelativeSource TemplatedParent}"/>
или
{Binding RelativeSource={RelativeSource TemplatedParent}}
Binding RelativeSource={
RelativeSource Mode=FindAncestor, AncestorType={x:Type ItemType}
}
...
атрибут по умолчанию RelativeSource
Mode
свойство. Полный набор допустимых значений дан здесь ( от MSDN):
PreviousData Позволяет Вам связывать предыдущий элемент данных (не, которые управляют, который содержит элемент данных) в списке отображаемых элементов данных.
TemplatedParent Относится к элементу, к которому шаблон (в который элемент с привязкой к данным существует), применяется. Это подобно установке TemplateBindingExtension и только применимо, если Привязка в шаблоне.
Сам Относится к элементу, на котором Вы устанавливаете привязку, и позволяет Вам связывать одно свойство того элемента к другому свойству на том же элементе.
FindAncestor Относится к предку в родительской цепочке элемента с привязкой к данным. Можно использовать это для привязки с предком определенного типа или его подклассов. Это - режим, который Вы используете, если Вы хотите определить AncestorType и/или AncestorLevel.
Следует отметить, что для тех, кто спотыкается о Silverlight:
Silverlight предлагает только сокращенное подмножество этих команд
Я только что опубликовал другое решение для доступа к DataContext родительского элемента в Silverlight, который работает на меня. Он использует Binding ElementName
.