WPF GridView не обновляется при наблюдаемом изменении коллекции - PullRequest
0 голосов
/ 19 февраля 2011

У меня есть Telerik RadGridView, привязанный к ObservableCollection определенного типа. При обновлении значения определенного свойства в этом типе обновляется соответствующая коллекция Observable, но не RadGridView ..

Ниже представлен 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>

Ниже приведен код модели представления:

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");
    }
}

Класс объекта:

public class Result{
   public decimal Weight { get; set; }
}

Ответы [ 3 ]

3 голосов
/ 19 февраля 2011

Каждый элемент в Наблюдаемой коллекции должен иметь способ сигнализировать WPF и, следовательно, элемент управления, который он обновляет, чтобы можно было обновить Количество. Обновление Observable Collection происходит, потому что эта коллекция содержит встроенное уведомление об изменениях для своей коллекции, но не отдельные элементы. Как уже говорили другие, внедрите INotifyPropertyChanged в Result, и он должен работать.

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");
        }
    }
}
1 голос
/ 19 февраля 2011

Как сказал Эрно, вашему классу Result необходимо реализовать INotifyPropertyChanged, и вам нужно вызвать OnPropertyChanged для свойства Weight.

Кроме того, ваша ViewModel должна также реализовывать INotifyPropertyChanged, чтобы вы могли избежать приведения к IHaveOnPropertyChangedMethod (что, кстати, присвоение имен довольно плохо), которое вы имеете в своем коде. Я бы предложил иметь класс ViewModelBase : INotifyPropertyChanged, от которого наследуются все ваши модели ViewModel. Если вы не хотите писать его самостоятельно, существует множество инфраструктур MVVM, в которых это встроено.

0 голосов
/ 19 февраля 2011

Если выполняемое вами обновление является обновлением свойства Weight объекта Result, то это может быть вызвано тем фактом, что класс Result не выполняет INotifyPropertyChanged.

ICollectionChanged (и, следовательно, также ObservableCollection) только уведомляет об изменениях в коллекции (добавление и удаление элементов).

...