2017-08-22 38 views
1

我有一个GridView与GridViewDataColumn从中我想过滤其中的布尔值,但我不想它写“真”“假”在过滤器中,但‘VRAI’‘人造’(法国)覆盖GridView中的默认布尔值过滤WPF,应用自定义布尔过滤器

目前过滤器自动完成(打印‘真’与‘假’,它过滤器),我无法访问布尔值的ToString()方法。 在我的代码后面我加载模型,并设置我的过滤器,如果“Filtersettings”不为空(当用户已保存其参数,很少发生)

我的XAML,我要筛选的列“Intégrée”

<telerik:GridViewColumn MinWidth="33"> 
       <telerik:GridViewColumn.CellTemplate> 
        <DataTemplate> 
         [Some Stuff] 
        </DataTemplate> 
       </telerik:GridViewColumn.CellTemplate> 
      [I deleted some stuff here] 
      </telerik:GridViewColumn> 
         <Style.Triggers> 
          <DataTrigger Binding="{Binding Valide}" Value="False"> 
           <Setter Property="telerik:GridViewCell.Background" Value="{StaticResource ValidationErrorColorBrush}" /> 
          </DataTrigger> 
         </Style.Triggers> 
        </Style> 
       </telerik:GridViewDataColumn.CellStyle> 
      </telerik:GridViewDataColumn> 
      <telerik:GridViewDataColumn Header="Intégrée"     UniqueName="Intégrée" DataMemberBinding="{Binding IsIntegree, Mode=OneWay}"        ShowDistinctFilters="True"/> 

我隐藏

public partial class DemandeCotationListeView : UserControl 
    { 
     public DemandeCotationListeView() 
     { 
      InitializeComponent(); 
      DemandeCotationListeViewModel demandeCotationViewModel = new DemandeCotationListeViewModel(); 
      DataContext = demandeCotationViewModel; 

      // Apply personalized filters 
      for (int cpt = 2; cpt < GridView.Columns.Count; cpt++) 
      { 
       GridView.Columns[cpt].FilteringControl = new PersonalizedFilteringControl(GridView.Columns[cpt]); 
      } 

    //Here I tried to access the filters 
      Telerik.Windows.Controls.GridViewColumn isIntegreeColumn = this.GridView.Columns["Intégrée"]; 
      IColumnFilterDescriptor integreeFilter = isIntegreeColumn.ColumnFilterDescriptor; 
    //I can't add a string but an object 
      // integreeFilter.DistinctFilter.AddDistinctValue("Faux"); 
     } 

     private void GridView_Loaded(object sender, RoutedEventArgs e) 
     { 
      try 
      { 
       IList<FilterSetting> filtersSettings = JsonConvert.DeserializeObject<IList<FilterSetting>>(Settings.Default.DemandeCotationViewFilterConfig); 
    //Never goes here because filterSettings is always null 
        if (filtersSettings != null) 
       { 
        foreach (FilterSetting filterSetting in filtersSettings) 
        { 
         IColumnFilterDescriptor filter = GridView.Columns[filterSetting.ColumnUniqueName].ColumnFilterDescriptor; 
         foreach (object distinctValue in filterSetting.SelectedDistinctValues) 
         { 
          if (distinctValue.GetType() == typeof(bool)) 
          { 
           bool value = (bool)distinctValue; 
           if (value) 
           { 
            filter.DistinctFilter.AddDistinctValue("Vrai"); 
           } 
           else 
           { 
            filter.DistinctFilter.AddDistinctValue("Faux"); 
           } 
          } 
          else 
          { 
           filter.DistinctFilter.AddDistinctValue(distinctValue); 
          } 
         } 

         if (filterSetting.Filter1 != null) 
         { 
          filter.FieldFilter.Filter1.Operator = filterSetting.Filter1.Operator; 
          filter.FieldFilter.Filter1.Value = filterSetting.Filter1.Value; 
          filter.FieldFilter.Filter1.IsCaseSensitive = filterSetting.Filter1.IsCaseSensitive; 
         } 
         filter.FieldFilter.LogicalOperator = filterSetting.FieldFilterLogicalOperator; 
         if (filterSetting.Filter2 != null) 
         { 
          filter.FieldFilter.Filter2.Operator = filterSetting.Filter2.Operator; 
          filter.FieldFilter.Filter2.Value = filterSetting.Filter2.Value; 
          filter.FieldFilter.Filter2.IsCaseSensitive = filterSetting.Filter2.IsCaseSensitive; 
         } 
        } 
       } 
       ColumnSetting columnsSetting = JsonConvert.DeserializeObject<ColumnSetting>(Settings.Default.DemandeCotationViewColumnConfig); 
       if (columnsSetting != null) 
       { 
        foreach (var kv in columnsSetting.ColumnPosition) 
        { 
         GridView.Columns[kv.Key].DisplayIndex = kv.Value; 
        } 
       } 
      } 
      catch (Exception exc) 
      { 
       MessageBox.Show("Chargement de la liste des contrats : " + exc.Message); 
      } 
     } 

回答

0

你可以尝试使用返回翻译字符串转换器的建议位置:http://www.telerik.com/forums/bool-filter-translation

<telerik:GridViewDataColumn Header="Intégrée" UniqueName="Intégrée" DataMemberBinding="{Binding IsIntegree, Converter={StaticResource MyConverter}}" ShowDistinctFilters="True"> 
    <telerik:GridViewDataColumn.CellTemplate> 
     <DataTemplate> 
      <CheckBox IsChecked="{Binding IsIntegree, Mode=TwoWay}"/> 
     </DataTemplate> 
    </telerik:GridViewDataColumn.CellTemplate> 
</telerik:GridViewDataColumn> 
+0

谢谢,我不知道为什么我没有想到这一点早。有效。 –

+0

如果我想使用GridViewDataColumn的“默认”复选框,我该怎么办?这里设置的复选框不同于此(默认情况下会自动创建) –

+0

如果您要自定义过滤器,则不使用默认设置 – mm8

0

我用了一个转换器。

的XAML

<telerik:GridViewDataColumn Header="Intégrée"     DataMemberBinding="{Binding IsIntegree,Converter={StaticResource BooleanToStringConverter}, Mode=OneWay}"         ShowDistinctFilters="True"> 
       <telerik:GridViewDataColumn.CellTemplate> 
        <DataTemplate> 
         <CheckBox IsChecked="{Binding IsIntegree, Mode=TwoWay}"/> 
        </DataTemplate> 
       </telerik:GridViewDataColumn.CellTemplate> 
      </telerik:GridViewDataColumn> 

转换器(别忘了声明它)

public class BooleanToStringConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     var val = System.Convert.ToBoolean(value, CultureInfo.InvariantCulture); 
     return val ? "Vrai" : "Faux"; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     string temp = value.ToString(); 
     return temp.ToLower().Equals("vrai") ? true : false; 
    } 
}