私はを、ItemsSource
の私が書いたカスタムコレクションを持つWPFアプリケーションに持っています。コレクションは、すべてのアイテムが特定の要件を満たしていることを強制します(つまり、最小値と最大値の間になければなりません)。特定の新しい項目を追加するためにWPF DataGridに強制する最良の方法は何ですか?
コレクションのクラスシグネチャは次のとおりです。
public class CheckedObservableCollection<T> : IList<T>, ICollection<T>, IList, ICollection,
INotifyCollectionChanged
where T : IComparable<T>, IEditableObject, ICloneable, INotifyPropertyChanged
私はの最後に追加された新しいアイテムでDataGrid
結果の最後の行の編集をコミットするDataGrid
機能を使用できるようにしたいですItemsSource
。
DataGrid
はデフォルトのコンストラクタを使用して作成した新しい項目を追加するだけです。だから、(密閉されたクラスであり、そのItemCollection
介して)間接的に新しい項目を追加、DataGrid
は宣言:
ItemsSource.Add(new T())
を。グリッドは代わりに、コレクションに課せられた制約を満たす別のTを追加したいと思います。
私の質問は次のとおりです:これを行う方法がありますか?誰かがすでにこれをしていますか?これを行うには最良の方法(最も簡単でコードに最も速く、パフォーマンスは問題ではありません)ですか?次のように
は現在、私はちょうど私自身でOnExecutedBeginEdit
機能を無効にするために
DataGrid
を派生:
MinValue
は、コレクション内の最小許容アイテムです
public class CheckedDataGrid<T> : DataGrid where T : IEditableObject, IComparable<T>, INotifyPropertyChanged, ICloneable
{
public CheckedDataGrid() : base() { }
private IEditableCollectionView EditableItems {
get { return (IEditableCollectionView)Items; }
}
protected override void OnExecutedBeginEdit(ExecutedRoutedEventArgs e) {
try {
base.OnExecutedBeginEdit(e);
} catch (ArgumentException) {
var source = ItemsSource as CheckedObservableCollection<T>;
source.Add((T)source.MinValue.Clone());
this.Focus();
}
}
}
。
私はこの解決策が嫌いです。アドバイスがありましたら、私はとても感謝しています!
誰でも興味を持って、私は定期的にDataGrid
でItemsSource
としての私の派生クラスを使用して、ちょうどBindingList<T>
代わりのObservableCollection<T>
から導出することにより問題を解決することになったために感謝
は、ここに私の答えを参照していることができhttp://stackoverflow.com/questions/4484256/how- use-a-factory-for-datagrid-canuseraddrows-true/9863828#9863828。 BindingListを使用して、必要な作業を行うことができます。 –
Phil
ありがとう! –