5

カスタムリストを使用して、データグリッド上のWPFでデータバインディングを実行しようとしています。私のカスタムリストクラスには、タイプのプライベートデータリストが含まれていますList<T>。このリストを公開することはできませんが、インデクサーは個々のアイテムを設定および取得するために公開されています。私のカスタムクラスは次のようになります。

public abstract class TestElementList<T> : IEnumerable
        where T : class
{
    protected List<T> Data { get; set; }
    public virtual T Get(int index)
    {
        T item = Data[index];
        return item;
    }

    public virtual void Set(int index, T item)
    {
         Data[index] = item;
    }
...
}

データはバインドされていますが、編集しようとすると'EditItem' is not allowed for this viewエラーが発生します。Webで広範囲な検索を行ったところ、IEditableCollectionViewインターフェイスも実装する必要があるかもしれないことがわかりました。誰かが私がこのインターフェースを実装する方法についての指針を与えるか、カスタムリストでデータバインディングを行うための他のより良い方法を提案するのを手伝ってくれますか?

4

3 に答える 3

3

私はあなたの要件を完全には理解していませんが、ObservableCollectionを使用することで問題が解決すると思いますか?

public abstract class TestElementList<T> : ObservableCollection<T>
    where T : class
 {
   public virtual T Get(int index)
   {
     T item = this[index];
     return item;
   }

   public virtual void Set(int index, T item)
   {
     this[index] = item;
   }
 ...
}
于 2010-06-08T23:28:08.860 に答える
3

同じ例外がありました。IListをバインドする必要があるようです。IEnumerableにバインドしていましたが、この例外がスローされました。

于 2012-02-25T02:41:48.360 に答える
1

私自身の観察を追加するだけです。Xamlで特別に定義された列と、そのItemsSourceが単純なディクショナリに設定されたデータグリッドがありました。2番目の列を編集しようとすると、辞書を参照してこの例外が発生しました。次に、データグリッドItemsSourceをキーのリスト(dataGrid.Keys.ToList())に設定します。次に、2番目の列を編集できます。リストビューでは「EditItem」が許可されているようです。

編集:これをもう少し掘り下げました。私はBeginningEditハンドラーを設定し、いじり始めました。私が気づいたことの1つは、このエラーが発生するたびに、EditingEventArgs.Sourceが境界線であったことです。時間を見つけることができれば、これをもう少し詳しく調べることができます。また、ある例では、辞書キーをリストに変換しても機能しませんでした。本質的に同じタイプの割り当てを行っていたコード内の他のすべての場所でリストが適切であったにもかかわらず、それをObservableコレクションに変換する必要がありました。

もう一度編集してください:わかりました。IListタイプの使用が機能しないものに対する別の修正があります。BeginningEditハンドラーをDataGridにアタッチし、次のコードをポイントします。

    private void Grid_BeginningEdit(object sender, DataGridBeginningEditEventArgs e)
    {
        //// Have to do this in the unusual case where the border of the cell gets selected
        //// and causes a crash 'EditItem is not allowed'
        e.Cancel = true;
    }

これは、どういうわけかセルの境界を物理的にタップダウンした場合にのみヒットします。イベントのOriginalSourceはBorderであり、ここで発生するのは、TextBoxやその他の編集可能な要素が期待どおりのソースである代わりに、この編集不可能なBorderが編集のために通過するため、例外が'に埋め込まれる原因になると思います。 EditItemは許可されていません'例外。無効な元のソースでバブルスルーする前にこのRoutedEventをキャンセルすると、トラックで発生するエラーが停止します。

私の場合、IListタイプを使用できないDataGridがあったので、これを見つけてうれしく思います。

于 2011-07-19T10:18:28.387 に答える