2014-01-15 100 views
0

我有一個Listview對象。
當我從Listview中選擇一個項目時,我需要知道ListviewselectedObject是否已被修改爲激活或不是saveButtonEF:檢查對象是否已被修改

這是我開始瞭如何使用Mvvmlight和Entity Framework 5:

public RelayCommand SaveObjectCommand { get; set; } 

public MainViewModel() 
{ 
    SaveObjectCommand = new RelayCommand(SaveObject, CanSaveObject); 
} 

private bool CanSaveObject() 
{ 
    using (DBContext ctx = new DBContext()) 
    { 
     //selectedObject is the object selected from the Listview 
     Object dbObject = ctx.Object.Single(x => x.ID == selectedObject.ID); 

     if (selectedObject == dbObject) //simplified 
      return false; 
    }  
} 

這是工作,但它是相當緩慢的。
其實每個我選擇從列表視圖對象時,我請求DB知道selectedObject等於在DB同一對象(我的方式知道如果selectedObject性能已被修改)

是否有更好的方法來做到這一點?
我聽說過DBContext.ChangeTracker,但它似乎需要一個DB請求。

+0

什麼時候發生變化纔會被修改?當它在UI上被持續或修改時,或者是什麼?當其中一個屬性在實際對象上被修改時?每選擇一次數據庫都不是一個好主意。 –

+0

我認爲這不是一個好主意,這是我的問題:)。 我有我可以修改selectedObject屬性的文本框 – anthoLB29

回答

0

我無法添加評論。 你使用什麼數據庫?它是否緊湊?

而對於你的問題的解決方法:你可以申報財產

private List<Object> MyCollectionOfObjects {get; set;} 

用自己的收集和訪問它在CanSaveObject()wethod。如果數據庫需要更新,則應更新數據庫和此屬性。

+0

我正在使用MSSQL,但我不認爲這很重要。 無論如何,我編輯我的問題,因爲我認爲我不夠清楚 – anthoLB29

+0

如果您使用MSSQL精簡版,這是非常重要的。如果不是,我不能幫助,除非我的建議在回答:( –

+0

其實,我正在使用MSSQL與Windows Azure,不知道版本 – anthoLB29

0

您提到過,您的textblocks大概textboxes可以修改所選對象的屬性,您將在其中檢查該對象是否爲CanSave。我建議在看IEditableObject接口

快速樣品

public class Customer : IEditableObject 
{ 

    struct CustomerData 
    { 
     internal string id ; 
     internal string firstName ; 
     internal string lastName ; 
    } 

    private CustomersList parent; 
    private CustomerData custData; 
    private CustomerData backupData; 
    private bool inTxn = false; 

    // Implements IEditableObject 
    void IEditableObject.BeginEdit() 
    { 
     Console.WriteLine("Start BeginEdit"); 
     if (!inTxn) 
     { 
      this.backupData = custData; 
      inTxn = true; 
      Console.WriteLine("BeginEdit - " + this.backupData.lastName); 
     } 
     Console.WriteLine("End BeginEdit"); 
    } 

    void IEditableObject.CancelEdit() 
    { 
     Console.WriteLine("Start CancelEdit"); 
     if (inTxn) 
     { 
      this.custData = backupData; 
      inTxn = false; 
      Console.WriteLine("CancelEdit - " + this.custData.lastName); 
     } 
     Console.WriteLine("End CancelEdit"); 
    } 

    void IEditableObject.EndEdit() 
    { 
     Console.WriteLine("Start EndEdit" + this.custData.id + this.custData.lastName); 
     if (inTxn) 
     { 
      backupData = new CustomerData(); 
      inTxn = false; 
      Console.WriteLine("Done EndEdit - " + this.custData.id + this.custData.lastName); 
     } 
     Console.WriteLine("End EndEdit"); 
    } 

    public Customer(string ID) : base() 
    { 
     this.custData = new CustomerData(); 
     this.custData.id = ID; 
     this.custData.firstName = ""; 
     this.custData.lastName = ""; 
    } 

    public string ID 
    { 
     get 
     { 
      return this.custData.id; 
     } 
    } 

    public string FirstName 
    { 
     get 
     { 
      return this.custData.firstName; 
     } 
     set 
     { 
      this.custData.firstName = value; 
      this.OnCustomerChanged(); 
     } 
    } 

    public string LastName 
    { 
     get 
     { 
      return this.custData.lastName; 
     } 
     set 
     { 
      this.custData.lastName = value; 
      this.OnCustomerChanged(); 
     } 
    } 

    internal CustomersList Parent 
    { 
     get 
     { 
      return parent; 
     } 
     set 
     { 
      parent = value ; 
     } 
    } 

    private void OnCustomerChanged() 
    { 
     if (!inTxn && Parent != null) 
     { 
      Parent.CustomerChanged(this); 
     } 
    } 

    public override string ToString() 
    { 
     StringWriter sb = new StringWriter(); 
     sb.Write(this.FirstName); 
     sb.Write(" "); 
     sb.Write(this.LastName); 
     return sb.ToString(); 
    } 
} 

我請求DB知道selectedObject等於在DB同一 對象(要知道我的方式,如果selectedObject屬性有 被修改)

在你的情況下,最好在內存中進行檢查,而不是去數據庫,看看是否有任何值是不同的到什麼輸入。

+0

謝謝你的回答。事實上,我的意思是文本框;)。您的解決方案似乎與我正在尋找的內容有關。 不幸的是,我的課是EF自動生成的,我無法修改它們。 – anthoLB29

+0

在你的'POCO'課上做一個部分課,或者你可以讓T4模板爲你做。但從那以後,你做錯了,你不想把實際的模型綁定到視圖。你正在打破MVVM模式。您需要ViewModel中的模型,並將模型的屬性包裝到ViewModel的屬性中。 –