2014-12-04 2 views
1

То, что я пытаюсь сделать, - установить количество десятичных знаков для ячейки в одном столбце на основе соответствующей строки в другом столбце. Но мне все еще нужен первый столбец, который позволяет сортировать после его преобразования.Изменить формат строки в ячейке DataGridTextColumn на основе значения в другом столбце и сохранить значения сортировки

Первое, что я пробовал, - это использовать IValueConverter. Вот XAML:

<Window.Resources> 
    <src:DataValueConverter x:Key="dataValueConverter" /> 
</Window.Resources> 

<Grid> 
    <DataGrid x:Name="dataGrid" AutoGenerateColumns="False"> 
     <DataGrid.Columns> 
      <DataGridTextColumn Header="Id" Binding="{Binding Id}"></DataGridTextColumn> 
      <DataGridTextColumn Header="Humidity" Binding="{Binding Humidity, Converter={StaticResource dataValueConverter}"></DataGridTextColumn> 
      <DataGridTextColumn Header="Version" Binding="{Binding Version}"></DataGridTextColumn>     
     </DataGrid.Columns> 
    </DataGrid> 
</Grid> 

Здесь я хочу количество знаков после запятой в значении влажности на основе значения в версии. Поэтому я попытался передать версию в ConverterParameter, а затем быстро обнаружил, что он не принимает привязки.

Я попытался использовать MultiBinding с MultiValueConverter, как предложено Binding ConverterParameter. Он показывал разные десятичные разряды, однако колонка больше не сортировалась. Также попробовал этот bindable ConverterParameter http://www.codeproject.com/Articles/456589/Bindable-Converter-Parameter, дающий те же результаты.

Так можно заполнить преобразовательПараметр, чтобы получить желаемые результаты?

<DataGridTextColumn Header="Humidity" Binding="{Binding Humidity, Converter={StaticResource dataValueConverter}, ConverterParameter=???}"> 

ответ

0

Решение было придерживаться MultiBinding, но и установить SortMemberPath для столбца влажности. Это сообщает столбцу, какое значение нужно сортировать. Таким образом, в результате XAML выглядит следующим образом:

<DataGrid x:Name="dataGrid" AutoGenerateColumns="False"> 
     <DataGrid.Columns> 
      <DataGridTextColumn Header="Id" Binding="{Binding Id}"></DataGridTextColumn> 
      <DataGridTextColumn Header="Humidity" SortMemberPath="Humidity"> 
       <DataGridTextColumn.Binding> 
        <MultiBinding Converter="{StaticResource multiDataValueConverter}"> 
         <Binding Path="Humidity" /> 
         <Binding Path="Version" /> 
        </MultiBinding> 
       </DataGridTextColumn.Binding> 
      </DataGridTextColumn> 

Затем код за это IMultiConverter, с чем-то вроде:

public class MultiDataValueConverter: IMultiValueConverter 
    { 

     public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     {      
      int version = (int)(values[1]); 

      string format = "0.0000"; 
      if(version==2) 
      { 
       format = "0.000000"; 
      } 

      double val = (double)(values[0]); 
      return val.ToString(format);    
     } 

     public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture) 
     { 
      throw new NotImplementedException(); 
     } 
    } 
Смежные вопросы