2017-08-29 59 views
0

我想在WPF MVVM中存儲我的Company模型的臨時版本,但是我遇到問題,即使我創建的臨時數據未綁定到我的UI元素,它仍然存在仍在更新中。如何在WPF MVVM中存儲臨時未修改的模型

這裏是當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.. 
}; 

但這似乎很繁瑣,我忽略了一個更簡單的方法。

+3

回顧C#refrence類型來理解爲什麼_tempCompany反映SelectedCompany – ASh

+0

變化模型實現'ICloneable'並使用爲您的時間'_tempCompany = passedCompany.Clone()' – dymanoid

+0

@dymanoid感謝。我會研究那個ASH。如何在EF生成模型時實現'ICloneable'? – CBreeze

回答

1

SelectedCompany屬性和_tempCompany字段引用相同的Company對象。如果你想存儲Company對象,你需要創建一個臨時版本的「一個臨時版本」,即你需要創建Company類像你的另一個實例正在做:

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

這不是累贅。

正如評論中所建議的那樣,您可以實現接口ICloneable,但這只是將其他實例的創建移動到實現接口的類中的方法。您仍然需要在某處創建另一個實例。

如何在EF生成模型時執行ICloneable

創建一個部分類並在這個實現Clone方法。

0

您必須創建一個視圖模型。目前Company是一個模型。試圖將它作爲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以比較它們並顯示確認按鈕。