Итак, дело в следующем:
- Я работаю с MVVM, поэтому у меня есть мои модели, модели представления и представления.
- Я хочу использовать MEF, чтобы иметь возможность расширять свое приложение.
- Я хочу хранить все данные в MainViewModel, поэтому каждый плагин может работать с фактическими данными.
- Плагин представляет собой UserControl, который будет отображаться как ContentControl в MainViewModel.
Код: Выделить всё
MainViewModel- Модели
- Привязка данных из MainViewModel в View.
- Импорт плагинов из папки X
- плагины должны привязать данные из MainViewModel к пользовательскому интерфейсу плагина.
- изменение Свойство в пользовательском интерфейсе плагина должно обновить данные в MainViewModel и обновить пользовательский интерфейс всех других плагинов.
Код: Выделить всё
public interface IPlugin
{
}
public interface IPluginData
{
string Name { get; }
}
Код: Выделить всё
private MyModel myfirstmodel;
private DirectoryCatalog catalog;
private CompositionContainer container;
[ImportMany]
IEnumerable Plugins;
public MainWindowViewModel()
{
string pluginPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
pluginPath = Path.Combine(pluginPath, "plugins");
if (!Directory.Exists(pluginPath))
Directory.CreateDirectory(pluginPath);
catalog = new DirectoryCatalog(pluginPath, "*.dll");
container = new CompositionContainer(catalog);
try
{
this.container.ComposeParts(this);
}
catch (CompositionException compositionException)
{
Console.WriteLine(compositionException.ToString());
}
}
Код: Выделить всё
public class MyModel
{
private string message;
private int number;
private DateTime date;
public string Message { get { return message; } set { message = value; } }
public int Number { get { return number; } set { number = value; } }
public DateTime Date { get { return date; } set { date = value; } }
}
Код: Выделить всё
[Export(typeof(IPlugin))]
[ExportMetadata("Name", "MyFirstPlugin")]
public partial class MyFirstPlugin : UserControl, IPlugin
{
public MyFirstPlugin()
{
InitializeComponent();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
//Change the message in MainWindowViewModel and the date when it gets changed.
}
}
Есть ли у кого-нибудь действительно хороший учебник или может показать мне, как это сделать?
Я был бы признателен за «как это сделать», а не просто «просто использовать INotifyPropertyChanged».
Возможно ли это вообще?
Подробнее здесь: https://stackoverflow.com/questions/328 ... -to-plugin
Мобильная версия