編集編集編集:
あはは!Cider のデザイン サーフェイスの血まみれのバグであることが判明しました。
証拠:
次の一連の 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>
接続するためにバグ レポートを送信しました。誰かが応答するかどうかを確認します
。文字列形式のエンティティ
「バグ」は設計者にあるため、この回答の残りの部分は、潜在的に有用ではありますが、半問題です。
ここで覚えておくべきことは、XAMLはXML であるため、それに応じてアンパサンドをエンコードする必要があるということです。
&
次のように動作する必要があります。
&
編集:
ああ、そうです-コメントの前後で説明されているように、問題はアンパサンド自体にあるのではなく、 a の周囲の中括弧内の置換マーカーの「エスケープ」にありますBinding
-これを修正するには、あなた'実際には 3 つのオプションがあります。
編集 2: ああ、マークダウンは私の投稿を気に入らないかもしれないと思います (そして、とにかく 1 つの点で間違っていました) - 完全な例を一緒にまとめることができるかどうか見てみましょう:
念のため、ここにもペーストビンのリンクがあります:
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>