2011-06-10 38 views
2

我有一個名爲UploadItem的類的應用程序。應用程序根據它的信息創建上傳任務,例如,需要創建上傳文件以將文件上傳到sitex.com,然後應用程序創建一個新的UploadItem並將其添加到ObservableCollection,該集合被綁定到一個listview 。使用MEF插件的數據綁定?

現在出現我無法解決的部分..我決定更改結構以便人們可以創建自己的插件來上傳文件,問題在於UploadItem類具有以下屬性:

string _PercentagedDone; 
    public string PercentageDone 
    { 
     get { return _PercentagedDone; } 
     set { _PercentagedDone = value + "%"; NotifyPropertyChanged("PercentageDone"); } 
    } 

但是插件控制文件如何上傳,那麼插件如何編輯位於UploadItem類中的PercentageDone屬性?如果沒有辦法做到這一點,那麼是否有另一種方法來實現這一點,即在主GUI上顯示進度?

回答

0

你會想爲插件定義一個接口。喜歡的東西:

public interface IUploadPlugin 
{ 
    Task<bool> Upload(IEnumerable<Stream> files); 

    int Progress { get; } 
} 

該插件則需要實現這個接口並導出自己:

[Export(typeof(IUploadPlugin))] 
public class MyUploader : IUploadPlugin, INotifyPropertyChanged 
{ 
    // ... 
} 

注意,這個插件實現INotifyPropertyChanged。這是處理更新進度的簡單方法。在Progress屬性上觸發PropertyChanged,然後將主視圖中的ProgressBar控件綁定到此屬性。確保你在UI線程上觸發了PropertyChanged。

另一種選擇是在屬性更改時觸發自定義事件。您可以在主視圖邏輯中處理此事件並更新進度。

請注意,我正在使用Task進行回報。這允許調用者等待,直到上傳任務完成。您可以使用回調,但使用下一版.NET的CTP,使用任務<>將允許您爲異步編程使用await關鍵字。看看herehere

+0

嗨,我明白你想要做什麼,這種方法也發生在我身上,除非這不是我想要做到的方式(原因是它需要很多代碼中的更改) 。 ObservableCollection通過以下xaml綁定到Listview: 集合只包含UploadItem類。該插件必須以某種方式編輯UploadItem類的屬性。此外,1個UploadItem類僅上載1個文件,並且該應用程序必須能夠同時上傳多個文件。 – Lith 2011-06-10 21:26:32

+0

如果插件沒有對UploadItem類的引用,則該插件無法更新PercentageDone屬性。有些人必須負責更新價值。你將不得不看看你的架構,並找出它應該是誰。 – 2011-06-11 01:52:36

+0

是的,我明白,我會這樣做。除此之外,非常感謝您在這裏幫助我,感謝您提供的豐富答案。我會將其標記爲答案。謝謝。 – Lith 2011-06-11 16:43:12