我有一个mvvm解决方案。在我的viewModel
中,我有QueryableCollectionView
个BaseClass
个对象和一个独立的BaseClass
元素(我们称之为seletedElem)。
BaseClass
拥有QueryableCollection
个对象的私有ChildClass
- SCollection
,以及返回此集合的属性。这两个类都实现了以下接口:INotifyPropertyChanged
,IDataErrorInfo
,IEditableObject
。在我看来,我raddatagrid
itemssource
被绑定到来自ObservableCollection
的{{1}} BaseClass
个viewModel
对象,所选项目被绑定到独立BaseClass
} object - selectedElem
。
Dataform以这种方式绑定到当前选定的网格项:
ItemsSource="{Binding ElementName=xxx,Path=DataContext.seletedElem.SCollection}"
然后在第一个DataGrid的选择更改事件之前,或者在将新项目插入网格之后,当我按下raddataform
的添加按钮时,SCollection
的当前项始终是空项类型ChildClass
,但在网格选择更改事件后(当选择其中一个现有项目时)SCollection
的当前项始终为空,我无法编辑它的属性。
dataGrid
和dataform
是Telerik组件。
无论如何都要解决这个问题吗?
答案 0 :(得分:1)
我找到了两种解决方法来处理这种情况,但它们并没有解决根本问题。我会在这里输入它们,它们可能对某人有用。
首先将QueryableCollection
SCollection直接复制到他的视图中
ViewModel
然后是网格的SelectionChanged
或DataForm等案例事件
CommitEdit
,EndEdit
,CancelEdit
只需设置所选“BaseClass”的SCollection
instance
来自ViewModel
第二次使用AddingNewItem
,EditEnded
,DeletingItem
DataForm
方法来支持你的
自己的操作逻辑特别是CRUD和验证操作。所以例如在
AddingNewItem
将手动空的ChildClass实例添加到所选对象
SCollection collecion - 代码示例:
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;
}