Связывание данных с плагинами с использованием MEF? - PullRequest
2 голосов
/ 10 июня 2011

У меня есть приложение с классом: UploadItem. Приложение создает задачи загрузки на основе имеющейся у него информации, например, необходимо создать загрузку для загрузки файла на sitex.com, при этом приложение создает новый элемент UploadItem и добавляет, что в коллекцию ObservableCollection коллекция привязывается к представлению списка. .

Теперь приходит часть, которую я не могу решить .. Я решил изменить структуру, чтобы люди могли создавать свои собственные плагины, которые могут загружать файл, проблема заключается в том, что класс UploadItem имеет такие свойства, как:

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

Но плагин управляет тем, как файл загружается, так как плагин будет редактировать свойство PercentageDone, расположенное в классе UploadItem? Если нет способа сделать такую ​​вещь, то есть ли другой способ добиться того же, то есть показать прогресс в основном графическом интерфейсе?

1 Ответ

0 голосов
/ 10 июня 2011

Вы хотите определить интерфейс для плагинов.Что-то вроде:

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

   int Progress { get; }
}

Затем плагины должны реализовать этот интерфейс и экспортировать себя:

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

Обратите внимание, что этот плагин реализует INotifyPropertyChanged.Это простой способ справиться с обновлением прогресса.Fire PropertyChanged для свойства Progress, а затем привязать данные к элементу управления ProgressBar в главном представлении к этому свойству.Убедитесь, что вы запускаете PropertyChanged в потоке пользовательского интерфейса.

Другой вариант - запуск пользовательского события при изменении свойства.Вы можете обработать это событие в логике основного вида и обновить ход выполнения.

Обратите внимание, что я использую Task для возврата.Это позволяет вызывающему абоненту дождаться окончания загрузки.Вместо этого вы можете использовать обратный вызов, но с CTP следующей версии .NET использование Task <> позволит вам использовать ключевое слово await для асинхронного программирования.Проверьте это здесь и здесь .

...