在GridView WPF中覆盖默认布尔过滤,应用自定义布尔过滤器 [英] Override default Boolean Filtering in GridView WPF, Apply Custom bool filter
问题描述
我有一个GridView与GridViewDataColumn,我想从中过滤布尔值,但我不想写它True或False在过滤器中,但Vrai和Faux(法语)
(打印True和False并过滤),我无法访问布尔的ToString()方法。
在我的Code后面加载模型并设置我的过滤器,如果Filtersettings不为null(当用户保存了它的参数,很少发生)
我的XAML,我想过滤列Intégrée
< telerik:GridViewColumn MinWidth = 33 >
< telerik:GridViewColumn.CellTemplate>
< DataTemplate>
[某些东西]
< / DataTemplate>
< / telerik:GridViewColumn.CellTemplate>
[我在这里删除了一些东西]
< / telerik:GridViewColumn>
< Style.Triggers>
< DataTrigger Binding ={Binding Valide}Value =False>
< Setter Property =telerik:GridViewCell.BackgroundValue ={StaticResource ValidationErrorColorBrush}/>
< / DataTrigger>
< / style>
< / telerik:GridViewDataColumn.CellStyle>
< / telerik:GridViewDataColumn>
< telerik:GridViewDataColumn Header =IntégréeUniqueName =IntégréeDataMemberBinding ={Binding IsIntegree,Mode = OneWay}ShowDistinctFilters =True/>
我的代码隐藏
public partial class DemandeCotationListeView:UserControl
{
public DemandeCotationListeView()
{
InitializeComponent();
DemandeCotationListeViewModel demandeCotationViewModel = new DemandeCotationListeViewModel();
DataContext = demandeCotationViewModel;
//应用个性化过滤器
for(int cpt = 2; cpt< GridView.Columns.Count; cpt ++)
{
GridView.Columns [cpt] .FilteringControl = new PersonalizedFilteringControl(GridView.Columns [cpt]);
}
//这里我试图访问过滤器
Telerik.Windows.Controls.GridViewColumn isIntegreeColumn = this.GridView.Columns [Intégrée];
IColumnFilterDescriptor integreeFilter = isIntegreeColumn.ColumnFilterDescriptor;
//我不能添加一个字符串,而是一个对象
// integreeFilter.DistinctFilter.AddDistinctValue(Faux);
private void GridView_Loaded(object sender,RoutedEventArgs e)
{
try
{
IList< FilterSetting> filtersSettings = JsonConvert.DeserializeObject< IList< FilterSetting>>(Settings.Default.DemandeCotationViewFilterConfig);
//因为filterSettings总是为空
if(filtersSettings!= null)
{
foreach(filtersSettings中的FilterSetting filterSetting)
{
IColumnFilterDescriptor filter = GridView.Columns [filterSetting.ColumnUniqueName] .ColumnFilterDescriptor;
foreach(filterSetting.SelectedDistinctValues中的object distinctValue)
{
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(columnsSetting.ColumnPosition中的var kv)
{
GridView.Columns [kv.Key] .DisplayIndex = kv 。值;
catch(Exception exc)
{
MessageBox.Show(Chargement de la liste des contrats:+ exc.Message );
$ div $解析方案
你可以尝试使用一个转换器,返回翻译后的字符串,如下所示: http:// www .telerik.com / forums / bool-filter-translation
< telerik:GridViewDataColumn Header =Intégrée UniqueName =IntégréeDataMemberBinding ={Binding IsIntegree,Converter = {StaticResource MyConverter}}ShowDistinctFilters =True>
< telerik:GridViewDataColumn.CellTemplate>
< DataTemplate>
< CheckBox IsChecked ={Binding IsIntegree,Mode = TwoWay}/>
< / DataTemplate>
< / telerik:GridViewDataColumn.CellTemplate>
< / telerik:GridViewDataColumn>
I have a GridView with GridViewDataColumn from which I want to filter on the boolean values in it but I don't want it to write "True" or "False" in the filter but "Vrai" and "Faux" (french)
Currently the filter is done automatically (prints "True" and "False" and it filters), I can't access the ToString() method of the boolean. In my Code behind I load the model and setup my filters if "Filtersettings" isn't null (when user has saved its parameters, happens rarely)
My XAML, I want to filter the column "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"/>
My codeBehind
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);
}
}
You could try to use a converter that returns the translated strings as suggested here: 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>
这篇关于在GridView WPF中覆盖默认布尔过滤,应用自定义布尔过滤器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!