Greetings,
I've taken an interesting approach to binding in the RadGridView in order to meet some business requirements. Specifically, I'm extending my bound object from System.Dynamic.DynamicObject in order to dynamically "add" properties to the object at run time based on user selection. Here's a simplified version of my bound object:
I add the items to my GridView using:
And my Grid is defined as such:
The approach works great for binding; however, the column filtering does not work. It seems to be broken when there's not a public property exposed.
I'm using the Q3/2010 Telerik controls.
Any help or work around would be appreciated. We must have column filtering.
Thanks a bunch.
I've taken an interesting approach to binding in the RadGridView in order to meet some business requirements. Specifically, I'm extending my bound object from System.Dynamic.DynamicObject in order to dynamically "add" properties to the object at run time based on user selection. Here's a simplified version of my bound object:
public class GridItem : DynamicObject, INotifyPropertyChanged{ public GridItem(DateTime dateTime, decimal value) { _dateTime = dateTime; _value = value; } //NOTE: The DateTime property is private forcing the GridView to use the DynamicObject implementation... private readonly DateTime _dateTime; private DateTime DateTime { get { return _dateTime; } } //NOTE: The Value property is private forcing the GridView to use the DynamicObject implementation... private decimal _value; private decimal Value { get { return _value; } set { _value = value; OnPropertyChanged("Value"); } } public override bool TryGetMember(GetMemberBinder binder, out object result) { result = null; switch (binder.Name) { case "DateTime": result = DateTime; break; case "Value": result = Value; break; } return true; } public override bool TrySetMember(SetMemberBinder binder, object value) { switch (binder.Name) { case "Value": decimal result; if(decimal.TryParse(value.ToString(), out result)) { Value = result; } break; } return true; } private static readonly IEnumerable<string> _members = new List<string>() { "DateTime", "Value" }; public override IEnumerable<string> GetDynamicMemberNames() { return _members; } public event PropertyChangedEventHandler PropertyChanged; private void OnPropertyChanged(string propertyName) { if (PropertyChanged == null) return; PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); }}I add the items to my GridView using:
this.GridView.ItemsSource = new List<GridItem>() { new GridItem(DateTime.Parse("1/1/2009"), 10.9m), new GridItem(DateTime.Parse("3/31/2010"), 11.4m), new GridItem(DateTime.Parse("5/1/2011"), 12.5m), };And my Grid is defined as such:
<Telerik:RadGridView x:Name="GridView" AutoGenerateColumns="False"> <Telerik:RadGridView.Columns> <Telerik:GridViewDataColumn UniqueName="DateTime" Header="Date/Time" DataMemberBinding="{Binding DateTime}" IsReadOnly="True" DataType="{x:Type System:DateTime}" IsFilterable="True" /> <Telerik:GridViewDataColumn UniqueName="Value" Header="Value" DataMemberBinding="{Binding Value}" DataType="{x:Type System:Decimal}" IsFilterable="True" /> </Telerik:RadGridView.Columns></Telerik:RadGridView>The approach works great for binding; however, the column filtering does not work. It seems to be broken when there's not a public property exposed.
I'm using the Q3/2010 Telerik controls.
Any help or work around would be appreciated. We must have column filtering.
Thanks a bunch.