2016-02-22 54 views
1

我使用SQLite在我的應用程序存儲一些Message對象。我在「視圖1」中顯示Message項目的列表。當我在編輯視圖「視圖2」中更改屬性時,我希望屬性也在列表中更改。C#SQLite的INotifyPropertyChanged的實施

Message.cs

class Message : INotifyPropertyChanged 
{ 
    private uint _id; 
    public uint Id 
    { 
     get 
     { 
      return _id; 
     } 
     set 
     { 
      // Trigger INotifyPropertyChanged 
      Set("Id", ref _id, value); 
     } 
    } 

    private string _content; 
    public string Content 
    { 
     get 
     { 
      return _content; 
     } 
     set 
     { 
      // Trigger INotifyPropertyChanged 
      Set("Content", ref _content, value); 
     } 
    } 

    ... 
} 

MessageViewModel.cs

class MessageViewModel : INotifyPropertyChanged 
{ 
    private Message message; 

    ... 

    private string _content; 
    public string Content 
    { 
     get 
     { 
      return message.Content; 
     } 
     set 
     { 
      // Set value 
      message.Content = value; 

      // Trigger INotifyPropertyChanged 
      RaisePropertyChanged(); 
     } 
    } 

    ... 
} 

查看1

View1.xaml

DataContext的是View1ViewModel

View1ViewModel.cs

private List<MessageViewModel> _messages; 
public List<MessageViewModel> Messages 
{ 
    get 
    { 
     return _messages; 
    } 
    set 
    { 
     // Trigger INotifyPropertyChanged 
     Set("Messages", ref _messages, value); 
    } 
} 

... 

private async void loadMessages() 
{ 
    // Get the messages from SQLite database 
    var messages = await newMessages(); 
    Messages = new MessageViewModelCollection(messages); 
} 

視圖2

View2ViewModel.cs

private MessageViewModel _message; 
public MessageViewModel Message 
{ 
    get 
    { 
     return _message; 
    } 
    set 
    { 
     // Trigger INotifyPropertyChanged 
     Set("Message", ref _message, value); 
    } 
} 

... 

private async void loadMessage() 
{ 
    // Get the message from SQLite database by Id 
    var message = await newMessage(messageId); 
    Message = new MessageViewModel(message); 
} 

功能newMessagesnewMessage(uint messageId)返回數據庫newMessage對象。

我通常使用INotifyPropertyChanged實現,但這不起作用。我查詢數據庫2次,一次查看列表(查看1),一次查詢編輯頁面(查看2)。 SQLite返回Message對象的兩個不同副本,因此INotifyPropertyChanged meganism將不起作用(僅在當前頁面中,而不在backstack中)。

我可以通過重新使用列表中的Message項來解決此問題,但我不能始終在所有視圖中都這樣做。

有沒有辦法讓INotifyPropertyChanged在這種情況下工作?或者我需要一種不同的方法來更新值?

回答

1

你需要不同的方法。恕我直言,最好的辦法是將數據模型從視圖模型中分離出來。所以有一個MessageVm結合到WPF視圖,並把邏輯放到它本身適當地更新從得到傳遞給它的Message對象(與發射任何必要INotifyPropertyChanged的一起)。

有一些自動映射工具,如Automapper這可能在某種程度上減輕伴隨此方法帶來的痛苦。

但是您真的應該將視圖模型與數據模型分開,這些層的解耦是WPF編程的一個原則原則。

+0

我已經在使用'MessageViewModel'來綁定到WPF視圖。虛擬機仍然存在問題。 「消息」對象發生變化,但「查看1」和「查看2」的ViewModel正在「查看」兩個不同的「消息」對象。通常兩個視圖模型將「觀察」相同的「消息」對象。 – Michael

+0

你是否直接將'Message'對象綁定到列表中?換句話說,MessageViewModel是否有兩個與WPF視圖綁定的Message對象列表?如果是這樣,你需要解耦,否則你會看到不希望的'INotifyPropertyChanged'被調用的挑戰。 – code4life

+0

對於「視圖1」,我使用了「List 」。該視圖將綁定到「MessageViewModel.PropertyA」。 「視圖2」只有一個'MessageViewModel',這個'MessageViewModel'更新'Message'對象,它只在「視圖2」中觸發'INotifyPropertyChanged'。 – Michael