2009-04-11 1 views
7

У меня есть DataGrid и Expander так:Binding StringFormat, кажется, не работает правильно

<StackPanel> 
<my:DataGrid Name="dataGrid1" AutoGenerateColumns="False" ItemsSource="{Binding}">...</my:DataGrid> 
<Expander Header="{Binding ElementName=dataGrid1, Path=SelectedItem.Name, StringFormat=Details of {0}}">...</Expander> 
</StackPanel> 

Связывание хорошо, но по какой-то причине строка форматирования не будет работать. Он всегда отображается только значение dataGrid1.SelectedItem.Name Я также попытался:

StringFormat=Details of \{0\} 

, который не работает.

Я даже попробовал просто установить свойство HeaderStringFormat расширителя на «Детали из {0}», но это также не форматирует его.

Я был в состоянии получить этот обходной путь, чтобы работать, хотя:

<Expander> 
<Expander.Header> 
<TextBox Text="{Binding ElementName=dataGrid1, Path=SelectedItem.Name, StringFormat=Details of {0}}"></TextBox> 
</Expander.Header> 
</Expander> 

Кто-нибудь знает, почему StringFormat не работает для свойства заголовка?

ответ

4

Согласно http://codingcontext.wordpress.com/2008/11/17/headerformatstring-and-contentformatstring/, это выглядит как свойство HeaderStringFormat не предназначено для использования с обязательным форматом строка, а указать формат для использования при связывании объекта, который реализует IFormattable.

Учитывая, что я не мог заставить форматирование строк работать непосредственно в выражении привязки, так что это может быть просто ошибкой. Вы должны попытаться уведомить Microsoft и, возможно, исправить это.

С вашим обходного, я предложил бы использовать TextBlock, а не TextBox, так как вы, вероятно, не хотите, чтобы пользователь, чтобы иметь возможность редактировать текст в заголовке Expander.

+0

Хорошо, это информативно. Благодарю. Кроме того, я использую TextBlock ... Наверное, я просто написал это неправильно, когда я сделал сообщение. – Adam

0

Возможно, это связано с тем, что заголовок является свойством типа объекта, а не строкой. Преобразование значения String в элемент управления пользовательского интерфейса может мешать форматированию. Вместо того, чтобы TextBox, работает ли Label? Это должно дать вам такой же эффект, как и то, что вы изначально пытались сделать.

Обновление: Также попробуйте поискать HeaderStringFormat.

+0

У вас есть пункт о Header быть объект и TextBox.Text - строка. Однако я просто попытался с меткой, и это сработало, когда я установил ContentFormatString в то, что хотел. Свойство «Содержимое метки» также является объектом, поэтому я до сих пор не понимаю ... что-то странное с заголовком. – Adam

3

Я также столкнулся с таким же вопросом и после прочтения некоторых статей, пытаясь всеми видам ContentStringFormat и HeaderStringFormat я просто решил сделать следующую вещь:

<Expander Grid.Row="1" Padding="4"> 
       <Expander.Header> 
       <TextBlock Text="{Binding ElementName=cbCategory, Path=SelectedItem.CategoryName, StringFormat='FORMATTED &quot;{0}&quot;'}"/> 
       </Expander.Header>