我正在使用WPF,MVVM和实体框架。
我正在使用数据输入应用程序,我正在尝试启用取消更改以在我的应用中工作。取消更改时,所有值都将重置为其原始值。我想我在EF侧设置正确的一切。基本上我只是将所有实体设置为未更改,如果它们在修改后的列表中。
我的问题是当我回到ViewModel时,我正在尝试重新设置所有字段和派生属性。最大的烦恼是收藏品。我们有多个组合框控件,我们绑定到ListCollectionView,然后我在视图模型中有一个表示SelectedItem的附加属性。当我重置集合时,我只是允许进程重新启动所有属性,包括集合。当我更改集合时,它还尝试更改所选属性。这样做的问题是,如果它更改了选定的属性,后台实体会使用新值进行更新(就像用户选择了一个项目一样),而且我在技术上无法获得该值。
我在保存时实际上遇到了反向问题。保存后,表单将进入非编辑模式,值将设置为旧值。在编辑中重新打开表单将加载正确的值。为了解决这个问题,我添加了表单IsSynchronizedWithCurrentItem = true。但现在我遇到问题反向问题,其中值在编辑期间返回到旧值。
// View Code
<ComboBox Grid.Row="1"
Grid.Column="2"
ItemTemplate="{StaticResource TransformerTypeDisplayDataTemplate}"
ItemsSource="{Binding Path=TransformerTypeCollection}"
SelectedItem="{Binding Path=SelectedTransformerType, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
IsSynchronizedWithCurrentItem="True"
Style="{StaticResource AssetViewStateAwareComboBox}" Margin="0,0,0,2" VerticalAlignment="Bottom" />
//ViewModel Properties
private ListCollectionView<TransformerType> _transformerTypeCollection;
public ListCollectionView<TransformerType> TransformerTypeCollection
{
get { return _transformerTypeCollection; }
set { _transformerTypeCollection = value; RaisePropertyChanged("TransformerTypeCollection"); }
}
private TransformerType _selectedTransformerType;
public TransformerType SelectedTransformerType
{
get
{
return _selectedTransformerType;
}
set
{
_selectedTransformerType = value;
if (IsInEditMode)
{
BackingEntity.TransformerTypeID = _selectedTransformerType.ID;
BackingEntity.TransformerType = _selectedTransformerType;
}
RaisePropertyChanged("SelectedTransformerType");
}
}
// Setting the collection will trigger the set method for SelectedTransformerType
TransformerTypeCollection = TaskCoordinator.TransformerTypes.GetView();
我目前解决这个问题的方法是保留一个状态变量,说明已经填充了集合。并且它会在重新设置视图模型时跳过重置集合。