我正在使用 WPF、MVVM 和实体框架。
我正在使用数据输入应用程序,并且我正在尝试启用取消更改以在我的应用程序中工作。取消更改时,所有值将重置为其原始值。我认为我在 EF 端的所有设置都正确。基本上,如果它们在修改后的列表中,我只是将所有实体设置为不变。
我的问题是当我回到 ViewModel 时,我正在尝试重新设置所有字段和派生属性。最大的烦恼是收藏。我们有多个组合框控件,我们绑定到 ListCollectionView,然后我在视图模型中有一个表示 SelectedItem 的附加属性。当我重置集合时,我只是允许该过程重新启动包括集合在内的所有属性。当我更改集合时,它也会尝试更改选定的属性。这样做的问题是,如果它更改了 selected 属性,则支持实体会使用新值更新(就像用户选择了一个项目一样),并且我在技术上无法取回该值。
当我保存时,我实际上遇到了一个相反的问题。保存后,表单将进入其非编辑模式,并且该值将设置为旧值。在编辑中重新打开表单将加载正确的值。为了解决这个问题,我添加了表单 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();
我目前针对这个问题的解决方法是我保留一个状态变量,该变量表示集合已经被填充。并且它跳过了在重新设置视图模型时重置集合。