I have a Telerik RadGridView Bound to ObservableCollection of defined type.. On Updating the value of a particular property in that type, the corresponding Observable collection is getting updated but not the RadGridView..
Below is the XAML:
<ComboBox Grid.Column="4" Width="100" Margin="4" ItemsSource="{Binding Path=ResultUnits, Mode=OneTime}" SelectedValue="{Binding Path=ResultUnit}"/>
<telerik:RadGridView ItemsSource="{Binding Path=Results, Mode=TwoWay}" FooterRowStyle="{StaticResource GridViewFooterStyle}" Width="{Binding RelativeSource={RelativeSource AncestorType= ScrollViewer}, Path=ActualWidth}" ColumnWidth="*" RowIndicatorVisibility="Collapsed" EditTriggers="None" IsFilteringAllowed="False" AutoGenerateColumns="False" AllowDrop="False" CanUserFreezeColumns="False" CanUserReorderColumns="False" CanUserDeleteRows="False" CanUserInsertRows="False" ShowGroupPanel="False" ShowColumnFooters="True">
<telerik:RadGridView.Columns>
<telerik:GridViewDataColumn Header="Quantity" DataMemberBinding="{Binding Path=Quantity}"/>
</telerik:RadGridView.Columns>
</telerik:RadGridView>
Below is the View Model Code:
public class ViewModel {
private const decimal PoundsToKilograms = 0.45359237M;
private const decimal GramstoPound = 0.00220462262M;
private ObservableCollection<Result> results;
public EnvironmentalSummaryViewModel() {
this.results= new ObservableCollection<Result>();
}
public ObservableCollection<Result> Results{
get {
return this.results;
}
set {
this.results = value;
}
}
public string ResultUnit {
get {
return this.resultUnit;
}
set {
if (this.resultUnit != value) {
this.resultUnit = value;
this.UpdateGridViewValuesOnResultUnitChanged();
}
}
}
private void UpdateGridViewValuesOnResultUnitChanged() {
bool isEnglish = this.resultUnit == this.resultUnits[0];
this.results.ToList().ForEach(result => {
decimal weight = isEnglish ? result.Weight * GramstoPound * 1000 : environmental.Weight * PoundsToKilograms;
result.Weight = Math.Round(weight, 2);
});
((IHaveOnPropertyChangedMethod) this).OnPropertyChanged("Results");
}
}
Object Class:
public class Result{
public decimal Weight { get; set; }
}
Each item within the Observable Collection must have a way to signal to WPF and therefore the control that it is updating so that the Quantity Value can be updated. The Observable Collection update is occuring because that collection contains in built change notification for its collection but not its individual items. As others have said implement INotifyPropertyChanged on Result and it should work.
public class Result : INotifyPropertyChanged
{
#region INotifyPropertyChanged Members
public event PropertyChangedEventHandler PropertyChanged;
protected void Notify(string propName)
{
if (this.PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propName));
}
}
#endregion
private decimal _weight;
public decimal Weight
{
get { return _weight; }
set {
this._weight = value;
Notify("Weight");
}
}
}