【问题标题】:WPF Caliburn.Micro and DXTabControl with UserControl not working带有 UserControl 的 WPF Caliburn.Micro 和 DXTabControl 不起作用
【发布时间】:2019-09-09 20:55:52
【问题描述】:

我正在尝试使用 TabControl 在 UserControl 之间切换。

我可以使用 XAML 将选项卡的内容设置为用户控件,但它只会绑定到视图而不是视图模型。

我的虚拟机是一个 Caliburn.Micro Conductor,只要用户切换标签,它就会调用 ActivateItem。当我只有一个用户控件时它工作得很好,但是当我创建另一个用户控件时,第一个不会加载视图。

这是我正在使用的一些代码:

ShellView:

<dx:ThemedWindow x:Class="PSCServiceManager.Views.ShellView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:cal="http://www.caliburnproject.org"
             xmlns:dx="http://schemas.devexpress.com/winfx/2008/xaml/core"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             mc:Ignorable="d"
             Title="Service Manager" WindowState="Maximized"
             Height="525" Width="720">

<Grid>
    <dx:DXTabControl>
        <dx:DXTabItem Header="Master Teknisi">
            <ContentControl x:Name="LoadMasterTechnicianView" cal:View.Model="{Binding ActiveItem}" />
        </dx:DXTabItem>

        <dx:DXTabItem Header="Servisan">
            <ContentControl x:Name="LoadServicesView" cal:View.Model="{Binding ActiveItem}" />
        </dx:DXTabItem>
    </dx:DXTabControl>
</Grid>

ShellViewModel:

using Caliburn.Micro;

namespace PSCServiceManager.ViewModels
{
    public class ShellViewModel : Conductor<IScreen>
    {
        private MasterTechnicianViewModel masterTechnicianViewModel;
        private ServicesViewModel servicesViewModel;

        public ShellViewModel()
        {
            LoadMasterTechnicianView();
        }

        public void LoadMasterTechnicianView()
        {
            ActivateItem(masterTechnicianViewModel);
        }

        public void LoadServicesView()
        {
            ActivateItem(servicesViewModel);
        }
    }
}

【问题讨论】:

    标签: c# wpf mvvm tabcontrol caliburn.micro


    【解决方案1】:

    实现此功能的一种更简单/替代的方法是创建一个您希望绑定到选项卡控件的用户控件集合。例如,

    public interface ITabUserControl
    {
        string DisplayName { get; set; }
    }
    
    public class MasterTechnicianViewModel : ITabUserControl
    {
        public string DisplayName { get; set; } = "Master Technician";
    }
    
    public class ServicesViewModel : ITabUserControl
    {
        public string DisplayName { get; set; } = "Services";
    }
    

    现在在您的 ShellViewModel 中,您可以创建一个 ITabUserControl 集合

    public List<ITabUserControl> UserControls { get; set; }
        public ShellViewModel()
        {
            UserControls = new List<ITabUserControl>();
            UserControls.Add(new MasterTechnicianViewModel());
            UserControls.Add(new ServicesViewModel());
        }
    

    并将您的 TabControl 绑定为

     <dx:DXTabControl x:Name="UserControls"/>
    

    现在您可以在控件之间切换而不会出现任何问题,而无需显式激活它。

    【讨论】:

      猜你喜欢
      • 2014-12-25
      • 2015-04-26
      • 2017-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多