2017-08-25 46 views
-1

我想這個問題可能已經被回答了,如果是這種情況,我會立即刪除。我是WPF的新手(真的是C#的新手),我儘可能地努力遵循MVVM,但是我非常努力地找到一種方法,在我的Model上不實現INotifyPropertyChanged使用MVVM,我如何在預定義的對象集合上實現INotifyPropertyChanged?

我的模型包含從另一個參考創建的預定義對象的集合。在模型中,我擁有在Task完成時更新的屬性。

CustomObject - API

public class CustomObject 
{ 
    private string _myTaskOutput; 

    public CustomObject() 
    { 
    _myTaskOutput = MyTaskMethod(); 
    } 

    //MyTaskMethod() 

    //Get & Setter for _myTaskOutput; 
} 

的Util - API

public static class Util 
{ 
    public IEnumerable<CustomObject> GenerateObjects() 
    { 
     var customObjectCollection = SomeHelperMethod(); 
     return customObjectCollection; 
    } 
} 

型號

public class CustomObjectCollectionModel 
    { 
    private IEnumerable<CustomObject> _customObjectCollection; 

    public CustomObjectCollectionModel() 
    { 
     _customObjectCollection = Util.GenerateObjects(); 
    } 

    //Get & Setter for IEnumerable<CustomObject> 
    } 

的對象引用不會改變,所以我相信有一個ObservableCollection出了問題(這是正確的?)和實施INotifyPropertyChangedCustomObject作品如預期,但我明白這不是做事的正確方法。

+0

「並在CustomObject上實現INotifyPropertyChanged按預期工作,但我理解這不是正確的做事方式。」是什麼讓你說這不是正確的方法? – Steven

+1

@Steven大多數關於MVVM的答案都是關於MV的。我猜這是因爲從視圖而不是ViewModel直接綁定到Model。 – Kitson88

+0

@Steven爲了給你一些背景,我爲我的投資組合創建了這個應用程序,希望能夠登錄我的第一個開發人員角色,所以我想確保它是正確的。 – Kitson88

回答

1

如果CustomObject是某種類型的域或業務對象,則可以將其包裝在客戶端應用程序的視圖模型類中。因此,不是綁定到ObservableCollection<CustomObject>,而是綁定到ObservableCollection<CustomObjectWrapper>,其中CustomObjectWrapper是一個客戶端特定的類,它實現了INotifyPropertyChanged接口(假設您實際需要在UI中提供更改通知)。

事實上,你必須創建爲您從服務API接收各CustomObject一個CustomObjectWrapper - 你可以在你的視圖模型類做到這一點 - 但在同一時間,你不必與污染客戶業務對象 - 特定的代碼。直接綁定到特定於域的業務對象很少有用。

+0

所以,爲了澄清,我是否需要將每個'CustomObject'的屬性映射到一個新的'CustomObjectWrapper'實例,然後綁定到承載'CustomObjectWrapper'的ViewModel屬性? – Kitson88

+0

是的,你基本上用視圖綁定到的所有屬性中的CustomObjectWrapper替換CustomObject。 – mm8

+0

我只是現在測試。 – Kitson88

相關問題