0

これは非常に単純なはずですが、何かが足りないようです。私は自分の問題を解決できるものに出くわすことなく、数時間探し回っていました。問題は、LINQクエリをWPF DataGridに割り当てることはできますが、DataGridの値の1つを編集しようとすると、次のエラーが発生することです。

System.InvalidOperationExceptionは未処理でしたMessage='EditItem'はこのビューでは許可されていません。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)at System.Windows.Controls.DataGrid.OnExecutedBeginEdit(Object sender、ExecutedRoutedEventArgs e)at System.Windows.Input.CommandBinding.OnExecuted(Object sender、ExecutedRoutedEventArgs e)

DataGridのXAMLは次のようになります。

<DataGrid AutoGenerateColumns="False" EnableRowVirtualization="True" Height="565" HorizontalAlignment="Left" Margin="6,92,0,0" Name="translatedStringsDataGrid1" RowDetailsVisibilityMode="VisibleWhenSelected" VerticalAlignment="Top" Width="602">
    <DataGrid.Columns>
    <DataGridTextColumn x:Name="stringsIDColumn2" Binding="{Binding Path=StringsID}" Header="Strings Name" Width="SizeToHeader" />
    <DataGridTextColumn x:Name="translatedStringsValueColumn1" Binding="{Binding Path=TranslatedStringsValue}" Header="Translated Strings Value" Width="SizeToHeader" />
    </DataGrid.Columns>
</DataGrid>

次のように、ComboBoxのSelectedChangeイベントでLINQクエリを実行しています。

private void cbSelectLang_SelectionChanged(object sender, SelectionChangedEventArgs e)
{

    var query = from o in _context.TranslatedStrings.Local 
                where o.LanguagesID == cbSelectLang.SelectedIndex + 1
                join r in _context.Strings.Local on o.StringsID equals r.StringsID into SubSet2

                from s in SubSet2.DefaultIfEmpty()

                select new { StringsID = s.StringsName, TranslatedStringsValue = o.TranslatedStringsValue };

    this.translatedStringsDataGrid1.ItemsSource = query;

}

これを達成するためのより簡単な方法があると誰かが考えるなら、私は「POCOエンティティ」を使用しています。誰かが私にそれを指摘するほど親切であるならば、私は本当に私が非常に基本的で明白な何かを逃していると感じます!:-)

どうもありがとう。

4

2 に答える 2

1

私はこれをテストしていませんが、あなたの問題はあなたがあなたのクエリから匿名のタイプを返しているからだと私はかなり確信しています。に変更してみてください

...
from s in SubSet2.DefaultIfEmpty()
select new MyRealType 
{ 
    StringsID = s.StringsName, 
    TranslatedStringsValue = o.TranslatedStringsValue 
};

MyRealTypeを定義する必要がある場所。

于 2012-05-21T17:12:13.010 に答える
0

Philのおかげもあって、ObservableCollectionと新しいホルダータイプを含む実行可能なテクニックができました。

    private class JoinClass
    {
        public string StringsID { get; set; }
        public string TranslatedStringsValue { get; set; }
    }

    private void cbSelectLang_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        ObservableCollection<JoinClass> collection = new ObservableCollection<JoinClass>();

        var query = from o in _context.TranslatedStrings.Local
                                where o.LanguagesID == cbSelectLang.SelectedIndex + 1
                                join r in _context.Strings.Local on o.StringsID equals r.StringsID into SubSet
                                from s in SubSet.DefaultIfEmpty()
                                select new JoinClass { StringsID = s.StringsName, TranslatedStringsValue = o.TranslatedStringsValue };

        foreach (var item in query)
        {
            collection.Add(item);
        }

        this.translatedStringsDataGrid1.ItemsSource = collection;
    }

ありがとうございました!

于 2012-05-21T19:20:26.567 に答える