2014-12-04 40 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。它確實顯示了不同的小數位數,但列不能再排序。也嘗試了這種可綁定的ConverterParameter http://www.codeproject.com/Articles/456589/Bindable-Converter-Parameter,給出了相同的結果。

那麼是否可以填寫ConverterParameter以獲得所需的結果?

<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(); 
     } 
    } 
相關問題