I need to create custom grid column based on kendo GridViewColumn.
My xaml:
<telerikGrid:RadGridView ItemsSource="{Binding CmbContest}" AutoGenerateColumns="False" >
<telerikGrid:RadGridView.Columns>
<telerikGrid:GridViewDataColumn Header="TestColumn" DataMemberBinding="{Binding Name}" ></telerikGrid:GridViewDataColumn>
<local:MultiDropDownColumn Header="SelectColumn" SelectedItem="{Binding SelectedDropDown, Mode=TwoWay}"></local:MultiDropDownColumn>
</telerikGrid:RadGridView.Columns>
</telerikGrid:RadGridView>
Here is my MultiDropDownColumn class:
public class MultiDropDownColumn : Telerik.Windows.Controls.GridViewBoundColumnBase
{
[BindableAttribute(true)]
public string SelectedItem
{
get
{
return (string)GetValue(SelectedItemProperty);
}
set
{
SetValue(SelectedItemProperty, value);
}
}
public override FrameworkElement CreateCellElement(GridViewCell cell, object dataItem)
{
TextBlock tb = cell.Content as TextBlock;
if (tb == null)
{
tb = new TextBlock();
}
tb.Text = this.SelectedItem;
return tb;
}
public static readonly DependencyProperty SelectedItemProperty =
DependencyProperty.Register(
"SelectedItem",
typeof(string),
typeof(MultiDropDownColumn),
new PropertyMetadata(string.Empty, OnSelectedItemChanged));
private static void OnSelectedItemChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
}
}
Assigned Data:
public class ViewModel
{
public List<DTO> CmbContest { get; set; }
public ViewModel()
{
CmbContest = new List<DTO>
{
new DTO{ Name="row1", SelectedDropDown="2"},
new DTO{ Name="row2", SelectedDropDown="1"},
};
}
}
When I assign data to this column, it appears empty:
The column itself has no DataContext
. It's a bit unclear what you are trying to do here but if you want to want to show the value of the source property in your column you should bind the TextBlock
to it.
This requires you to store the path to the property of the source somewhere, for example in your dependency property. This displays the value:
public class MultiDropDownColumn : Telerik.Windows.Controls.GridViewDataColumn
{
public string SelectedItem
{
get
{
return (string)GetValue(SelectedItemProperty);
}
set
{
SetValue(SelectedItemProperty, value);
}
}
public override FrameworkElement CreateCellElement(GridViewCell cell, object dataItem)
{
TextBlock tb = cell.Content as TextBlock;
if (tb == null)
{
tb = new TextBlock();
}
tb.SetBinding(TextBlock.TextProperty, new Binding(SelectedItem));
return tb;
}
public static readonly DependencyProperty SelectedItemProperty =
DependencyProperty.Register(
"SelectedItem",
typeof(string),
typeof(MultiDropDownColumn),
new PropertyMetadata(string.Empty, OnSelectedItemChanged));
private static void OnSelectedItemChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
}
}
XAML:
<telerikGrid:RadGridView x:Name="CmbContest" ItemsSource="{Binding CmbContest}" AutoGenerateColumns="False" >
<telerikGrid:RadGridView.Columns>
<telerikGrid:GridViewDataColumn Header="TestColumn" DataMemberBinding="{Binding Name}" ></telerikGrid:GridViewDataColumn>
<local:MultiDropDownColumn Header="SelectColumn" SelectedItem="SelectedDropDown" />
</telerikGrid:RadGridView.Columns>
</telerikGrid:RadGridView>