3

私はWPFに比較的慣れていないので、誰かが私を助けてくれるかどうか疑問に思っていました。

すべてのアイテムを格納する監視可能なコレクション リストを保持するコレクション ビューがあります。私のデータグリッドの項目ソースはコレクション ビューです。データグリッド XAML で単純なグループ化を行っています...

            <DataGrid.GroupStyle>
            <GroupStyle>
                <GroupStyle.HeaderTemplate>
                    <DataTemplate>
                        <StackPanel>
                            <TextBlock Text="{Binding Name}" FontWeight="Bold" Padding="3"/>
                        </StackPanel>
                    </DataTemplate>
                </GroupStyle.HeaderTemplate>
            </GroupStyle>
        </DataGrid.GroupStyle>

今...アイテムの追加/削除は問題なく機能しますが、アイテムを更新/編集するたびにグループは更新されません。たとえば、アイテムが都市ごとにグループ化されているとします。1 つの都市名「シアトル」の下に 3 つのアイテムがある場合、それらの都市名の 1 つを「ブルックリン」に変更します。「ブルックリン」都市は、observablecollection リストを再作成するまで、シアトル グループの下に残ります。 .

私の現在の回避策は...都市が変更されるたびに、グループが更新されるように、オブザーバブルコレクションリストを文字通りクリアして再入力することです...もっと良い方法が必要です!

私の質問は、アイテムを更新/編集するたびに手動/動的にデータグリッド グループを更新する方法はありますか?

INotifyPropertyChanged に注意してください。90% は問題ではないと確信しています。このインターフェイスとのあらゆる組み合わせを試しましたが、アイテムを編集/更新するたびにグループが更新されません。ただし、新しい都市の場合はアイテムを追加するたびに新しいグループが作成され、都市のすべてのアイテムを削除すると、その都市グループも削除されます。また、特定のアイテムだけでなく、任意のアイテム列もあります。

編集OK、まだ解決策はありません...しかし、別の回避策を見つけましたが、これもまた最もエレガントではありません。シティ ボックスのイベント ハンドラーを配置します。そのため、都市が変更されるたびにイベント ハンドラーが呼び出され、コレクション ビューが更新されます。ただし、アイテムを追加するたびにイベントが呼び出され、アイテムをクリックすると呼び出され、変更を加えるたびに2回呼び出されるため、すべてが効率的ではありません..まだアイデアを探しています.

EDIT2 IEditableObject の BeginEdit とEndEditを調べて、必要なものが得られるかどうかを確認しています。

どんな助けでも大歓迎です、ありがとう!

4

2 に答える 2

0

私は同じ問題に遭遇しました。ObservableCollectionImplementation で動作するようになりました。これは、分離された Eventhandler によって項目の変更を生成します (ここを参照してください)。したがって、ViewModel 内では、イベント ハンドラーで ItemPropertyChanges をサブスクライブし、すべてを強制的に更新します。

多分それはまだ誰かを助けます。

よろしく!

public class MyViewModel: ViewModelBase
{
  ObservableCollectionEx<IEditableItem> _rawsource;
  ICollectionView _viewSource;

  public MyViewModel (ObservableCollectionEx rawDataSource)
  {
    this._rawsource = rawDataSource;
    this._rawsource.ItemPropertyChanged += new PropertyChangedEventHandler(RawSource_ItemPropertyChanged);

    // Create the CollectionView
    this._viewSource = new ListCollectionView(this._rawsource);
  }

  void RawSource_ItemPropertyChanged(object sender, PropertyChangedEventArgs e)
  {
    // Check if this is a Collection of EditableObjects - so a CommitEdit can be fired
if (this._viewSource is IEditableCollectionView)
    {
      var so = this._viewSource as IEditableCollectionView;
      so.CommitEdit();
    }

// CollectionView refresh
this._viewSource.Refresh();
  }

  // Here is our Bindable object
  public ICollectionView ItemSourcer
  {
get
{
  return this._viewSource;
}
  }

 // ...

}
于 2014-01-08T14:26:50.330 に答える