如何在WPF MVVM中存储临时未修改的模型

时间:2017-08-29 09:23:00

标签: c# wpf mvvm

我想在WPF MVVM中存储我的Company模型的临时版本但是我遇到的问题是即使我创建的temp没有绑定到我的UI元素,它仍然在被更新。

以下是实例化ModifyCompanyViewModel时发生的情况:

public ModifyCompanyViewModel(Company passedCompany)
{
    SelectedCompany = passedCompany;
    _tempCompany = passedCompany;
    CloseWindowCommand = new CloseableCommand<Window>(CloseWindow);
}

所以我有一个名为Company的只读_tempCompany。 UI元素的绑定方式如下:

<TextBox Grid.Row="1" Grid.Column="1" x:Name="NameTextBox" Text="{Binding SelectedCompany.Name, Mode=TwoWay}"/>

显然他们与SelectedCompany绑定了。如果我在TextBox中输入了包含公司名称的不同内容,但返回_tempCompany _tempCompany的名称反映了我输入的内容。

如何以某种方式存储_tempCompany,无论键入什么,它的名称都保持不变?我已经开始使用这种方法:

_tempCompany = new Company
{
    Id = passedCompany.Id,
    Name = passedCompany.Name
    //Other properties..
};

但这看起来非常麻烦,我忽略了一种更简单的方法。

2 个答案:

答案 0 :(得分:1)

SelectedCompany属性和_tempCompany字段引用相同的Company对象。如果你想存储&#34;临时版本&#34;您需要创建一个临时版本的Company对象,即您需要像当前一样创建Company类的另一个实例:

_tempCompany = new Company
{
    Id = passedCompany.Id,
    Name = passedCompany.Name
    //Other properties..
};

这并不麻烦。

正如评论中建议的那样,您可以实现ICloneable接口,但这只是将另一个实例的创建移动到实现接口的类中的方法。您仍然需要在某处创建另一个实例。

  

如何在EF生成模型时实现ICloneable

创建一个分部类并在此实现Clone方法。

答案 1 :(得分:0)

您必须创建一个viewmodel。目前Company是一个模型。尝试将它用作viewmodel(以绑定到其属性)迟早会导致问题,因为你提到它已生成。

考虑一个简单的viewmodel包装公司:

public class CompanyViewModel: INotifyPropertyChanged
{
    readonly Company _company;
    public CompanyViewModel(Company company)
    {
        _company = company;
    }

    // now expose something
    public string Address
    {
        get { return _company.Address }
        set
        {
            // tracking changes
            // note: you aren't tracking changes made to model instance!
            _company.Address = value;
            OnPropertyChanged();
        }
    }

    // and here is what you actually want, read-only name
    public string Name => _company.Name;

    // you can optinally expose model and bind to it properties
    // but that wouldn't let you track the changes
    // unless model implements INotifyPropertyChanged
    public Company Company => _company;

    ...
}

如果你想编辑公司名称,那么只需创建另一个属性(称之为NewName),在构造函数中设置其初始值并自行决定其值何时将替换为_company.Name(例如在某些属性中)用户完成编辑时将调用的方法AcceptChanges()。您将能够访问NewName并且尚未更改_company.Name来比较它们并显示确认按钮。