具有数据网格和数据表单的QueryableCollectionView-选择已更改问题
本文关键字:数据 选择 QueryableCollectionView- 问题 表单 数据网 网格 数据表 | 更新日期: 2023-09-27 18:23:36
我有一个mvvm解决方案。在我的viewModel
中,我有一个类BaseClass
对象的QueryableCollectionView
和一个独立的BaseClass
元素(让我们称之为seletedElem)。
BaseClass
具有ChildClass
对象的专用QueryableCollection
-SCollection
,以及返回此集合的属性。这两个类都实现了以下接口:INotifyPropertyChanged
、IDataErrorInfo
、IEditableObject
。在我看来,我有raddatagrid
,其中itemssource
绑定到来自viewModel
的BaseClass
对象中的ObservableCollection
,所选项目绑定到独立的BaseClass
对象selectedElem
。
Dataform通过以下方式绑定到当前选择的网格项:
ItemsSource="{Binding ElementName=xxx,Path=DataContext.seletedElem.SCollection}"
然后,在第一个DataGrid的选择更改事件之前,或者在将新项目插入到网格之后,当我按下raddataform
的添加按钮时,SCollection
的当前项目始终是类型为ChildClass
的空项目,但在网格的选择更改事件之后(当选择了现有项目之一时),CCD_ 22的当前项目始终为空,并且我无法编辑其属性。
dataGrid
和dataform
是Telerik组件。
是否有任何方法可以修复这种行为?
我找到了两种解决方法来处理这种情况,但它们并不能解决根本问题。我会把它们打在这里,它们可能对某人有用。
第一次将QueryableCollection
集合直接复制到视图ViewModel
,然后是大小写事件,如网格的SelectionChanged
或DataFormCommitEdit
、EndEdit
、CancelEdit
仅设置所选"BaseClass"的SCollectioninstance
从ViewModel
到当前SCollection
第二,使用AddingNewItem
、EditEnded
、DeletingItem
DataForm
方法来支持yor自己的操作逻辑,特别是CRUD和验证操作。例如在AddingNewItem
手动将空的ChildClass实例添加到所选对象S收集-代码示例:
public void OnAddingNewItem(object sender, AddingNewItemEventArgs e)
{
ChildClass item = new ChildClass();
var queryable = SelectedBaseObject.SCollection.OfType<ChildClass>().ToList();
queryable.Add(item);
SelectedBaseObject.SCollection = new QueryableCollectionView(new ObservableCollection<ChildClass>(queryable));
((RadDataForm) sender).BeginEdit();
e.Cancel = true;
}