2015-05-05 4 views
0

В WPF, как я могу префикс всех ячеек в редактируемом столбце datagrid значком доллара ($) и все еще привязывать к свойству объекта CLR типа decimal?WPF, префикс ячейки datagrid

Документация MSDN имеет тенденцию указывать на стили как способы настройки внешнего вида элементов в datagrid (см. here). Однако я не хочу устанавливать свойство. Я хочу префикс данных знаком доллара.

Я пробовал использовать data templates. Вот выдержка из моего XAML, показывающий шаблон данных:

... 
<Window.Resources> 
    <DataTemplate DataType="{x:Type Binding}" x:Key="myDataTemplate"> 
     <TextBlock> 
      <Run>$</Run> 
      <TextBox Text="{Binding}"></TextBox> 
     </TextBlock> 
    </DataTemplate> 
</Window.Resources> 
... 

Однако, единственное место, где я могу найти, чтобы включить это в DataGrid находится в HeaderTemplate собственности DataGridTextColumn, так как в этом отрывке дальше в том же XAML. Это отображает $, за которым следует только текстовое поле в заголовке. Я бы хотел, чтобы это произошло не в заголовке, а во всех остальных ячейках этой строки.

... 
<DataGrid.Columns> 
    <DataGridTextColumn Header="Header1" 
      Binding="{Binding Path=decimalProperty}" 
      HeaderTemplate="{StaticResource myDataTemplate}"> 
    </DataGridTextColumn> 
</DataGrid.Columns> 
... 

Конечно, есть код-сзади, но скелетная контур здесь должен описать то, что я пытаюсь сделать.

Простое изменение свойства, чтобы ввести строку в код и префикс знака доллара, не является вариантом.

+0

Вы можете использовать DataGridTemplateColumn вместо DataGridTextColumn? –

+0

Значит, вы не хотите использовать 'CellStyle'? Который предназначен для того, что вы хотите – Guerudo

+0

@Guerudo извините, чтобы ввести в заблуждение, я просто не могу понять, как сделать CellStyle делать это. Ответ с помощью CellStyle был бы отличным. –

ответ

1

Я только что видел ваши изменения, просто использовать форматирование текста на binding._

<TextBlock Text="{Binding YourText, StringFormat={}{0:C}}"/> 

Я надеюсь, что это помогает.

+0

Спасибо, но я пытаюсь избежать манипуляции с классом, чтобы добавить некоторое форматирование в свойство. Да, свойство использует INotifyPropertyChanged, и класс реализует ObservableCollection <>, поэтому C# отлично подходит для привязки данных с этой точки зрения. –

+0

Почему бы вам просто не использовать форматирование строк, которое по существу является ''. Вы можете, очевидно, сделать более продвинутый материал, чтобы при определенных обстоятельствах «$» не был виден ... – MoonKnight

+0

@AaronThomas, пожалуйста, см. Править ... – MoonKnight

1

Вы можете использовать DataGridTemplateColumn. См. Ниже код.

<DataGridTemplateColumn Header="Header1" > 
        <DataGridTemplateColumn.CellTemplate> 
         <DataTemplate> 
          <TextBlock> 
           <Run>$</Run> 
           <TextBox Text="{Binding decimalProperty}"/> 
          </TextBlock> 
         </DataTemplate> 
        </DataGridTemplateColumn.CellTemplate>       
       </DataGridTemplateColumn> 
0

Вот еще один вариант:

XAML:

<DataGrid AutoGeneratingColumn="OnAutoGeneratingColumn"/> 

Код:

private void OnAutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e) 
{ 
    if (e.PropertyType == typeof(decimal)) 
     ((DataGridBoundColumn)e.Column).Binding.StringFormat = "c"; 
} 
+0

Ницца! Чтобы отсортировать этот столбец, предоставит ли он какие-либо преимущества другим упомянутым решениям? –

+0

@AaronThomas Для этого решения сортировка работает из коробки. Но я думаю, что не должно быть слишком сложно включить сортировку для других решений. Я думаю, вам нужно будет установить https://msdn.microsoft.com/en-us/library/system.windows.controls.datagridcolumn.sortmemberpath.aspx – Stipo

+0

@AaronThomas Мне нравится это решение, потому что оно использует большую часть встроенных WPF - в функциональности (для динамического создания столбцов на основе источника данных) с небольшой настройкой, чтобы получить желаемый результат. И он также будет работать для всех будущих столбцов/свойств, которые являются typeof (десятичными), поэтому он автоматически расширяется. Он использует код-позади, но я думаю, что не весь код-код плохой (пока он не выполняет работу модели представления). – Stipo