Композитный WPF - Связывание MetroTabControl с контентом в плагинах? - PullRequest
0 голосов
/ 12 сентября 2018

Я относительно новичок в более продвинутых темах 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

Любые предложения о том, что я упускаю, или недоразумение приветствуется:)

...