这一定非常简单,但我似乎错过了一些东西。我已经搜索了几个小时而没有遇到任何可以解决我问题的事情。问题是虽然我可以将我的LINQ查询分配给WPF DataGrid,但当我尝试编辑DataGrid的一个值时,我得到以下错误:
System.InvalidOperationException未处理 此视图不允许使用Message ='EditItem'。 来源= PresentationFramework 堆栈跟踪: 在System.Windows.Controls.ItemCollection.System.ComponentModel.IEditableCollectionView.EditItem(Object item) 在System.Windows.Controls.DataGrid.EditRowItem(Object rowItem) 在System.Windows.Controls.DataGrid.OnExecutedBeginEdit(ExecutedRoutedEventArgs e) 在System.Windows.Controls.DataGrid.OnExecutedBeginEdit(Object sender,ExecutedRoutedEventArgs e) 在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实体”,如果有人认为有更简单的方法来实现这一点。我真的觉得我错过了一些非常基本和明显的东西,如果有人愿意指出我的话! : - )
非常感谢。
答案 0 :(得分:1)
我没有对此进行测试,但我相当确定您的问题是因为您从查询中返回了匿名类型。尝试将其更改为
...
from s in SubSet2.DefaultIfEmpty()
select new MyRealType
{
StringsID = s.StringsName,
TranslatedStringsValue = o.TranslatedStringsValue
};
您需要定义MyRealType。
答案 1 :(得分: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;
}
谢谢!