Can we bind a non-boolen property to DataGridCheckBoxColumn in C1DataGrid? Yes, we can. Simply using a binding converter and returning the required bool property works great in this case. This is a pretty common scenario and useful in lot of scenarios. Say, you have a simple property of type string having values as "Yes"/"No" or a integer property having values as 0/1 and you want to use DataGridCheckBoxColumn to show these values. Let bind a collection of following class objects to C1DataGrid:-
public class Product
{
public string Name { get; set; }
public string IsAvailable { get; set; }
}
Below xaml code binds the 'IsAvailabe' property DataGridCheckBoxColumn using a Converter :-
<c1:C1DataGrid x:Name="_dataGrid" AutoGenerateColumns="False">
<c1:C1DataGrid.Columns>
<c1:DataGridTextColumn Binding="{Binding Name, Mode=TwoWay}" Header="Name" SortMemberPath="Name" FilterMemberPath="Name"/>
<c1:DataGridCheckBoxColumn Header="Is Available" Binding="{Binding Path=IsAvailable, Mode=TwoWay, Converter={StaticResource CheckBoxConverter}}" SortMemberPath="IsAvailable" FilterMemberPath="IsAvailable"/>
</c1:C1DataGrid.Columns>
</c1:C1DataGrid>
The simple converter used in this case is below:-
public class CheckBoxConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value != null && value is string)
{
if (value.ToString().Trim() == "Yes")
return true;
else
return false;
}
else
return false;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value != null && value is bool)
{
if ((bool)value == true)
return "Yes";
else
return "No";
}
else
return "No";
}
}
That was simple. Now, will filtering be working on the DataGridCheckBoxColumn in this case? No, it will not. The CheckBox FilterType will simply not work with the string property. You actually have to create a custom filter (inherited from DataGridCheckBoxFilter) and manually change the FilterTypes/Values. You then have to assign this custom filter to the DataGridCheckBoxColumn. Below code creates a custom filter inherited from DataGridCheckBoxFilter:-
public class MyDataGridCheckBoxFilter : DataGridCheckBoxFilter
{
protected override DataGridFilterState GetFilter()
{
var newfilterinfo = new List<DataGridFilterInfo>();
var fs= base.GetFilter();
if (fs != null)
{
foreach (var fi in fs.FilterInfo)
{
var newfi = new DataGridFilterInfo();
if ((bool)fi.Value == true)
{
newfi.FilterCombination = fi.FilterCombination;
newfi.FilterOperation = DataGridFilterOperation.Equal;
newfi.FilterType = DataGridFilterType.Text;
newfi.Value = "Yes";
newfilterinfo.Add(newfi);
}
else
{
newfi.FilterCombination = fi.FilterCombination;
newfi.FilterOperation = DataGridFilterOperation.Equal;
newfi.FilterType = DataGridFilterType.Text;
newfi.Value = "No";
newfilterinfo.Add(newfi);
}
}
}
return new DataGridFilterState() { FilterInfo = newfilterinfo };
}
protected override void SetFilter(DataGridFilterState filterState)
{
var newfilterinfo = new List<DataGridFilterInfo>();
if (filterState != null)
{
foreach (var fi in filterState.FilterInfo)
{
if (fi.FilterType == DataGridFilterType.CheckBox)
break;
var newfi = new DataGridFilterInfo();
if (fi.Value.ToString() == "Yes")
{
newfi.FilterCombination = fi.FilterCombination;
newfi.FilterOperation = DataGridFilterOperation.Equal ;
newfi.FilterType = DataGridFilterType.CheckBox ;
newfi.Value = true;
newfilterinfo.Add(newfi);
}
else if (fi.Value.ToString() == "No")
{
newfi.FilterCombination = fi.FilterCombination;
newfi.FilterOperation = DataGridFilterOperation.Equal;
newfi.FilterType = DataGridFilterType.CheckBox;
newfi.Value = false;
newfilterinfo.Add(newfi);
}
filterState.FilterInfo = newfilterinfo;
}
}
base.SetFilter(filterState);
}
}
Use the LoadingFilter event of column to assign the filter:-
private IDataGridFilter LoadngFilter(object sender, EventArgs e)
{
var filter = new DataGridFilter();
filter.InnerControl = new MyDataGridCheckBoxFilter();
return filter;
}
That's it. We now have added the filtering feature too. Please refer to attached sample for complete implementation. Download Sample