2

この例外について、ここと MS フォーラムで見つけることができるすべての Q&A を読み、理解したほとんどの提案と他のいくつかの提案を試しました。この例外は、さまざまな原因で発生する可能性があるようです。

他の場合と同様に、コレクションにバインドされた WPF DataGrid があり、セルの 1 つを編集しようとするとこの例外がスローされます。それらは書き込み可能に設定され、コレクションは ObservableCollection です。通知メッセージを送信する get および set ハンドラーを実装しました。

私が試したことのない提案は、IList の非ジェネリック インターフェイスの実装に関するものです。また、アプリ内のさまざまなリストやコレクションにバインドされた多くの DataGrid があり、これは LINQ コレクションにバインドされたときに機能していました。

ここで何をする必要があるかを理解するのを手伝ってください。

データ グリッドは次のとおりです。

<DataGrid Name="dgIngredients" Margin="567,32,0,44" Width="360" ItemsSource="{Binding}" IsReadOnly="False"
           AutoGenerateColumns="False" HorizontalAlignment="Left" CanUserAddRows="False" CanUserDeleteRows="False">
    <DataGrid.Columns>
        <DataGridTextColumn Width="63" Header="Percent" Binding="{Binding Preference}" IsReadOnly="False" />
        <DataGridTextColumn SortDirection="Descending" Width="301" Header="Ingredient" Binding="{Binding Ingredient}" IsReadOnly="True" CanUserSort="True" CanUserReorder="False" />
    </DataGrid.Columns>
</DataGrid>

編集中の列は、読み取り専用ではない Preference です。

コレクションは次のとおりです。

private ObservableCollection<RAM_Ingredient> MemberIngredientPrefs = new ObservableCollection<RAM_Ingredient>();

バインディングは次のとおりです。

dgIngredients.DataContext = MemberIngredientPrefs.OrderBy("Ingredient",true);

RAM_Ingredient は次のとおりです。

public class RAM_Ingredient : INotifyPropertyChanged 

RAM_Ingredient.Preference の場所:

private int _Preference;
public int Preference
{
    get
    {
        return _Preference;
    }
    set
    {
        // This is needed to send notification of changes (and to not throw an exception on grid edit!):
        if ((_Preference != value))
        {
            SendPropertyChanging();
            _Preference = value;
            SendPropertyChanged("Preference");
        }
    }
}

例外は次のとおりです。

System.InvalidOperationException was unhandled
  Message='EditItem' is not allowed for this view.
  Source=PresentationFramework
  StackTrace:
       at System.Windows.Controls.ItemCollection.System.ComponentModel.IEditableCollectionView.EditItem(Object item)
       at System.Windows.Controls.DataGrid.EditRowItem(Object rowItem)
       at System.Windows.Controls.DataGrid.OnExecutedBeginEdit(ExecutedRoutedEventArgs e)

等...

4

6 に答える 6

2

具体的に何が問題を引き起こしたのかはまだわかりませんが、なんとか回避できました。やり過ぎたことがどれだけあったかはわかりませんが、うまくいきます。

DataGrid 行にデータを保持するためだけに、新しいクラスを作成しました。このクラスのオブジェクトの List を作成し、それを入力して、前と同じように DataGrid にバインドします。また、変更通知を機能させるための通常のものとナンセンスを追加し (おそらくやり過ぎです)、コメディー全体の状況のた​​めに、別の方法で比較関数を再定義してソートする必要がありました。

すなわち

List<UsablePref> MemberIngredientPrefs = new List<UsablePref>();

...

            foreach (RAM_Ingredient ingredient in App.Ingredients)
        {
            ingredient.GetPreferences(EditorMember);
            UsablePref pref = new UsablePref();
            pref.Ingredient = ingredient.Ingredient;
            pref.IngredientID = ingredient.IngredientID;
            pref.Preference = ingredient.Preference;
            MemberIngredientPrefs.Add(pref);
        }

        // Sort alphabetically by ingredient name, 
        MemberIngredientPrefs.Sort(UsablePref.CompareByName);
        // and bind the ingredient prefs DataGrid to its corresponding List
        dgIngredients.DataContext = MemberIngredientPrefs;
于 2012-08-27T02:34:15.533 に答える
1

結合から行のリストを作成しようとすると、同じ問題が発生しました。LINQ クエリは IEnumerable を返すため、DataGrid をその IEnumerable にバインドしました。これは読み取り専用では問題なく機能し、奇妙なことに、私が使用した ComboBoxes やその他のカスタム コントロールでも機能しましたが、プレーン テキストの編集で InvalidOperationException がスローされました。解決策は、IEnumerable の代わりに ObservableCollection でした。基本的に:

BoundView = (/*LINQ QUERY*/); // is IEnumerable<CustomJoinObject>

BoundView = new ObservableCollection<CustomJoinObject>(/*LINQ QUERY*/);

どちらの場合も、BoundView は DataGrid の DataContext です。

これは、IEnumerable にはデータグリッドをサポートする機構がなく、ObservableCollection にはあるためだと思います。

于 2016-04-28T19:45:19.750 に答える