覆盖GridView WPF中的默认布尔过滤,应用自定义bool过滤器

时间:2017-08-22 16:15:31

标签: c# wpf xaml gridview filter

我有一个带有GridViewDataColumn的GridView,我想从中筛选出布尔值,但我不希望它写“True”“False”在过滤器中但“Vrai”“Faux”(法语)

目前过滤器是自动完成的(打印“True”和“False”并过滤),我无法访问布尔值的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);
            }
        }

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分: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;
    }
}