1

定義されたタイプの ObservableCollection にバインドされた Telerik RadGridView があります。そのタイプの特定のプロパティの値を更新すると、対応する 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; }
}
4

3 に答える 3

3

Observable Collection 内の各アイテムには、WPF にシグナルを送る方法が必要であり、したがって、Quantity Value を更新できるように更新していることを制御する必要があります。Observable Collection の更新が発生しているのは、そのコレクションにそのコレクションの組み込みの変更通知が含まれているが、個々のアイテムは含まれていないためです。他の人が言っているように、結果に INotifyPropertyChanged を実装するとうまくいくはずです。

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");
        }
    }
}
于 2011-02-19T18:15:01.887 に答える
1

Erno が言ったように、Result クラスは INotifyPropertyChanged を実装する必要がありOnPropertyChangedWeightプロパティを呼び出す必要があります。

また、ViewModel は INotifyPropertyChanged も実装する必要があるため、コードに含まIHaveOnPropertyChangedMethodれているキャスト (ネーミングはかなり悪い) を回避できます。ViewModelBase : INotifyPropertyChangedすべての ViewModel が継承するクラスを用意することをお勧めします。自分で作成したくない場合は、これが組み込まれている MVVM フレームワークがたくさんあります。

于 2011-02-19T15:39:03.253 に答える
0

実行している更新が結果オブジェクトの Weight プロパティの更新である場合、結果クラスが INotifyPropertyChanged を実装していないことが原因である可能性があります。

ICollectionChanged (および ObservableCollection も) は、コレクションへの変更(アイテムの追加と削除) のみを通知します。

于 2011-02-19T15:14:11.680 に答える