WPF + Caliburn Micro + MVVM:TabItem处理

时间:2018-08-31 10:02:47

标签: c# wpf mvvm tabitem

我试图使用WPF,Caliburn Micro和MVVM模式制作一个包含tabcontrol的弹出窗口,在这种情况下无需使用任何代码。 tabcontrol包含1个以上的tabitem。在SO中挖掘了一些线程后,我结合了找到的解决方案,可以创建弹出窗口,并用 tabcontrol及其Tabitems I take it from this thread )填充它。

问题:这些选项卡显示视图模型中的内容(文本),但不显示视图中的内容。请查看此处附带的代码。

预期,我希望看到文本“ Tab Item 1”作为TabItem1标头,文本“ Selection One”作为TabItem1的内容。现在,TabItems的标题和内容都包含相同的文本“ Tab Item 1”。

我想念什么吗?我在这里附上代码。请随时更改代码。任何提示都将受到高度赞赏。

代码顺序:

  • TabItem1,TabItem2视图和视图模型
  • ITabItem
  • PopUp窗口视图和视图模型
  • AppBootstrapper,Shell视图和视图模型

TabItem1ViewModel (TabItem2ViewModel具有相同的内容)

public class TabItem1ViewModel : Screen, ITabItem
{
    public TabItem1ViewModel() => DisplayName = "Tab Item 1";
}

注意::在下面的TabItem视图中,我使用Label来显示文本“选择一”,但此文本根本没有出现。 Tab模型1的内容仅显示在视图模型中定义的显示名称“标签项1”

TabItem1View (TabItem2View具有相同的内容)

<UserControl
    x:Class="CmTabControl.Views.TabItem1View"
    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"
    d:DesignHeight="450"
    d:DesignWidth="800"
    mc:Ignorable="d">
    <Grid>
        <TabItem x:Name="TabItem1" Header="{Binding Path=DisplayName}">
            <Grid x:Name="TabItem1ContentGrid">
                <Label HorizontalAlignment="Left"                     
                    VerticalAlignment="Top"
                    Content="Selection One" />
            </Grid>
        </TabItem>
    </Grid>
</UserControl>

ITabItem (是,它只是一个空接口)

public interface ITabItem : IScreen
{
}

PopUpViewModel

public class PopUpViewModel : Screen
{
    public PopUpViewModel()
    {
        TabItems.Add(new TabItem1ViewModel());
        TabItems.Add(new TabItem2ViewModel());
    }

    private readonly BindableCollection<ITabItem> _tabItems = new BindableCollection<ITabItem>();
    public BindableCollection<ITabItem> TabItems
    {
        get => _tabItems;
        set
        {
            if (_tabItems == null)
            {
                return;
            }
            _tabItems.Clear();
            _tabItems.AddRange(value);
            NotifyOfPropertyChange(() => TabItems);
        }
    }
}

PopUpView

<Window
    x:Class="CmTabControl.Views.PopUpView"
    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:local="clr-namespace:CmTabControl.Views"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    Title="PopUpView"
    Width="800"
    Height="450"
    mc:Ignorable="d">
    <Grid Margin="3,8,3,3" HorizontalAlignment="Stretch"
        VerticalAlignment="Stretch">
        <TabControl x:Name="TabItems" />
    </Grid>
</Window>

AppBootstrapper

public class AppBootstrapper : BootstrapperBase
{
    private readonly SimpleContainer _container = new SimpleContainer();

    public AppBootstrapper() => Initialize();
    protected override object GetInstance(Type serviceType, string key) => _container.GetInstance(serviceType, key);
    protected override IEnumerable<object> GetAllInstances(Type serviceType) => _container.GetAllInstances(serviceType);
    protected override void BuildUp(object instance) => _container.BuildUp(instance);

    protected override void Configure()
    {
        base.Configure();

        _container.Singleton<IWindowManager, WindowManager>();
        _container.Singleton<IEventAggregator, EventAggregator>();
        _container.Singleton<ShellViewModel>();
        _container.PerRequest<PopUpViewModel>(); // Or Singleton if there'll only ever be one
    }

    protected override void OnStartup(object sender, StartupEventArgs e)
    {
        base.OnStartup(sender, e);
        DisplayRootViewFor<ShellViewModel>();
    }
}

ShellViewModel

public class ShellViewModel : Conductor<object>.Collection.AllActive
{
    private IWindowManager _windowManager;

    public ShellViewModel(PopUpViewModel popUpVm)
    {
        DisplayName = "Shell Window";
        PopUpViewModel = popUpVm;
    }

    public PopUpViewModel PopUpViewModel { get; set; }

    public sealed override void ActivateItem(object item) => base.ActivateItem(item);

    public void OpenPopUp()
    {
        ActivateItem(PopUpViewModel);
        if (_windowManager == null) _windowManager = new WindowManager();
        _windowManager.ShowDialog(PopUpViewModel, null, null);
    }

    public sealed override string DisplayName { get; set; }
}

ShellView

<UserControl
    x:Class="CmTabControl.Views.ShellView"
    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"
    d:DesignHeight="300"
    d:DesignWidth="300"
    mc:Ignorable="d">
    <Grid Width="300" Height="300"
        HorizontalAlignment="Center" VerticalAlignment="Center">
        <Button x:Name="OpenPopUp" Width="100" Height="35"
            Content="Open Popup" />
    </Grid>
</UserControl>

已添加:实时视觉树的屏幕截图。 enter image description here

0 个答案:

没有答案