Я относительно новичок в более продвинутых темах WPF (но не в C # / .net) и пытаюсь создать приложение WPF, составленное из различных плагинов.
У меня нетлюбые проблемы с плагинами и т. д. - проблема связана с тем, как я могу связать их в MahApps.MetroAnimatedTabControl, каждый плагин будет создавать свою собственную вкладку, опять же, это не проблема.
Что я имеюпопытка до сих пор
MainWindow.xaml
<Controls:MetroWindow x:Class="prototype.CompositeWpf.CompositedApp.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:Controls="clr-namespace:MahApps.Metro.Controls;assembly=MahApps.Metro"
xmlns:local="clr-namespace:prototype.CompositeWpf.CompositedApp"
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
xmlns:vm="clr-namespace:prototype.CompositeWpf.CompositedApp.ViewModels"
mc:Ignorable="d"
Title="Composite WPF Prototype" Height="450" Width="800"
ShowMaxRestoreButton="False">
<Controls:MetroWindow.DataContext>
<vm:MainWindowViewModel />
</Controls:MetroWindow.DataContext>
<Grid>
<Controls:MetroAnimatedTabControl Name="mainTabControl" ItemsSource="{Binding Plugins/Plugin.GetTabContent, Mode=OneWay}">
<Controls:MetroAnimatedTabControl.ContentTemplate>
<Binding Path="Plugins/Plugin.GetTabContent" Mode="OneWay" />
</Controls:MetroAnimatedTabControl.ContentTemplate>
</Controls:MetroAnimatedTabControl>
</Grid>
</Controls:MetroWindow>
MainWindowViewModel.cs
public class MainWindowViewModel
{
private ObservableCollection<PluginViewModel> _Plugins;
public ObservableCollection<PluginViewModel> Plugins
{
get { return this._Plugins; }
set
{
if (this._Plugins != value)
{
this._Plugins = value;
}
}
}
public MainWindowViewModel()
{
this.Plugins = new ObservableCollection<PluginViewModel>(App.Plugins.Select(x => new PluginViewModel(x)));
}
}
PluginViewModel.cs
public class PluginViewModel
{
private object _settingsView;
public ICompositeMain Plugin { get; private set; }
public object SettingsView
{
get { return this._settingsView ?? (this._settingsView = this.Plugin.GetSettingsTree); }
}
public PluginViewModel(ICompositeMain plugin)
{
this.Plugin = plugin;
}
}
ICompositeMain.cs
public interface ICompositeMain : INotifyPropertyChanged
{
string PluginName { get; }
string TabDisplayName { get; }
object GetTabContent { get; }
}
Интерфейс ICompositeMain применяется к плагинам и является относительно простым, TabDisplayName.должен быть связан с MetrolTabItem.Header, а GetTabContent - с MetroTabItem.Content
Любые предложения о том, что я упускаю, или недоразумение приветствуется:)