我想在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..
};
但这看起来非常麻烦,我忽略了一种更简单的方法。
答案 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
来比较它们并显示确认按钮。