2011-06-10 77 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