当ListCollectionView更改时,SelectedItem正在更新

时间:2016-03-09 13:43:30

标签: wpf mvvm listcollectionview

我正在使用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();

我目前解决这个问题的方法是保留一个状态变量,说明已经填充了集合。并且它会在重新设置视图模型时跳过重置集合。

0 个答案:

没有答案