【问题标题】:Override default Boolean Filtering in GridView WPF, Apply Custom bool filter覆盖 GridView WPF 中的默认布尔过滤,应用自定义布尔过滤器
【发布时间】:2018-01-31 00:48:08
【问题描述】:

我有一个带有 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);
            }
        }

【问题讨论】:

    标签: c# wpf xaml gridview filter


    【解决方案1】:

    您可以尝试使用返回翻译后字符串的转换器,如下所示: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>
    

    【讨论】:

    • 谢谢,不知道为什么我没有早点想到。它奏效了。
    • 如果我想使用 GridViewDataColumn 的“默认”复选框,我该怎么做?这里设置了一个不同于以前的复选框(默认情况下自动创建。
    • 如果要自定义过滤器,请不要使用默认的。
    • 这是我的问题(请参阅我的其他帖子)我需要自定义我的过滤器而不是我的复选框。
    【解决方案2】:

    我使用了转换器。

    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;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-05
      • 2021-02-24
      • 1970-01-01
      • 1970-01-01
      • 2021-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多