EDITEDITEDIT:
Ага! Оказывается, это кровавый баг с дизайнерской поверхностью Сидра!
Доказательство:
Попробуйте эту последовательность строк XAML:
<StackPanel>
<!-- should show '$YoMamma' -->
<TextBlock Text="{Binding Path=Value, StringFormat=${0}}"/>
<!-- should show '%YoMamma' -->
<TextBlock Text="{Binding Path=Value, StringFormat=%{0}}"/>
<!-- should show '&YoMamma', but crashes the designer -->
<!--<TextBlock Text="{Binding Path=Value, StringFormat=&{0}}"/>-->
<!-- should show '"YoMamma', but crashes the designer -->
<!--<TextBlock Text="{Binding Path=Value, StringFormat='{0}}"/>-->
<!-- should show '(YoMamma' -->
<TextBlock Text="{Binding Path=Value, StringFormat=({0}}"/>
<!-- should show ')YoMamma' -->
<TextBlock Text="{Binding Path=Value, StringFormat=){0}}"/>
</StackPanel>
Я отправил отчет об ошибке для подключения, посмотрим, ответит ли кто-нибудь: https://connect.microsoft.com/VisualStudio/feedback/details/782059/cider-vs2010-designer-bug-with-binding-using-escaped-entity-in-stringformat
Остальная часть этого ответа является полу-спорной, хотя и потенциально полезной, поскольку «ошибка» лежит на дизайнере.
Здесь следует помнить, что XAML - это XML, поэтому вам необходимо соответствующим образом кодировать амперсанды:
&
должно работать, а также:
&
РЕДАКТИРОВАТЬ:
Ах, да - так что, как обсуждалось в комментариях, проблема заключалась не в амперсанде per se, а в "экранировании" замещающих маркеров в окружающих фигурных скобках Binding
- чтобы исправить это, у вас есть три варианта:
РЕДАКТИРОВАТЬ 2: Ба, я думаю, что markdown может не понравиться мой пост (и я все равно ошибался в одном пункте) - давайте посмотрим, смогу ли я собрать полный пример:
На всякий случай вот и ссылка pastebin: http://pastebin.com/yfrpvxs1
Скажем, у нас есть такой объект контекста:
public class Foo : INotifyPropertyChanged
{
private string _value;
public string Value
{
get { return _value; }
set { _value = value; FireNpc("Value"); }
}
private decimal _numberValue;
public decimal NumberValue
{
get { return _numberValue; }
set { _numberValue = value; FireNpc("NumberValue"); }
}
private DateTime _dateValue;
public DateTime DateValue
{
get { return _dateValue; }
set { _dateValue = value; FireNpc("DateValue"); }
}
public event PropertyChangedEventHandler PropertyChanged = delegate { };
private void FireNpc(string name)
{
PropertyChanged(this, new PropertyChangedEventArgs(name));
}
}
И код окна:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
this.DataContext = new Foo()
{
Value = "YoMamma",
DateValue = DateTime.Now,
NumberValue = 3.14m
};
}
}
Давайте XAML!
<Window x:Class="WpfApplication2.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<StackPanel>
<!-- should show '#1:Foo & Bar:YoMamma' -->
<TextBlock Text="{Binding Path=Value, StringFormat=#1:Foo & Bar:{0}}"/>
<!-- should show '#2:Foo & Bar:YoMamma' -->
<TextBlock>
<TextBlock.Text>
<Binding Path="Value" StringFormat="#2:Foo & Bar:{0}"/>
</TextBlock.Text>
</TextBlock>
<!-- will actually show the '{' and '}', so 'Foo & Bar:{0}' -->
<TextBlock Text="{Binding Path=Value, StringFormat=Foo & Bar:{{0}}}"/>
<!-- default 'custom' (there's a fun oxymoron) format - should be '$3.14' -->
<TextBlock Text="{Binding Path=NumberValue, StringFormat=c}"/>
<!-- custom 'custom' (bear with me) format -->
<TextBlock Text="{Binding Path=DateValue, StringFormat=MM/dd/yyyy}"/>
<!-- multi parameter formatting-->
<TextBlock>
<TextBlock.Text>
<MultiBinding StringFormat="As of {2:MM/dd/yyyy}, {0} cost {1:c}">
<Binding Path="Value"/>
<Binding Path="NumberValue"/>
<Binding Path="DateValue"/>
</MultiBinding>
</TextBlock.Text>
</TextBlock>
</StackPanel>
</Window>
Теперь, воспользовавшись этим MultiBinding
, мы можем сделать что-нибудь глупое - давайте добавим это в наш контекст:
// Heh...don't actually do this, naturally...
private string _ampersandValue;
public string AmpersandValue
{
get { return _ampersandValue; }
set { _ampersandValue = value; FireNpc("AmpersandValue"); }
}
this.DataContext = new Foo()
{
Value = "YoMamma",
DateValue = DateTime.Now,
NumberValue = 3.14m,
AmpersandValue = "&"
};
И добавьте этот XAML:
<!-- And a crazy-person's method, using multi parameter formatting-->
<TextBlock>
<TextBlock.Text>
<MultiBinding StringFormat="{}{0} {1} {0} = {0}">
<Binding Path="Value"/>
<Binding Path="AmpersandValue"/>
</MultiBinding>
</TextBlock.Text>
</TextBlock>
person
JerKimball
schedule
22.03.2013
StringFormat=Foo & Bar: {}{0}
работает на вас ... Вы используете это в реальной привязке, например{Binding SomeString, StringFormat=Foo & Bar: {}{0}}
? Это не работает для меня. Я должен поставить{}
перед всей строкой, а не только перед значением, как в моем ответе а>. Но я думаю, что разные синтаксисы могут работать с разными версиями WPF. - person Rachel   schedule 25.03.2013