Caliburn Micro - 在选项卡控件上显示名称 - 初学者问题
Caliburn Micro - Display a name on a tab control - Beginner issue
参考资料
Github 项目 CMTabNavigation
TargetFramework netcoreapp3.0
PackageReference Caliburn.Micro Version="4.0.105-alpha"
我正在做第一个示例,当用户单击菜单项时在选项卡控件中显示 ViewModel。
该示例工作正常,但选项卡上的显示名称不起作用。你能帮帮我吗
<Window x:Class="CMTabNav.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"
xmlns:cal="http://www.caliburnproject.org"
xmlns:local="clr-namespace:CMTabNav.Views"
mc:Ignorable="d"
Title="ShellView" Height="450" Width="800">
<DockPanel>
<Menu DockPanel.Dock="Top" FontSize="25">
<MenuItem Header="_File">
<MenuItem.Background>
<RadialGradientBrush>
<GradientStop Color="Black" Offset="0"/>
<GradientStop Color="#FFC3C1AD" Offset="0.105"/>
</RadialGradientBrush>
</MenuItem.Background>
<MenuItem x:Name="PartsList" Header="_Parts List" />
<MenuItem x:Name="AssembliesList" Header="_Assembly List" />
<MenuItem x:Name="Demo" Header="_Demo" />
<MenuItem x:Name="ExitApplication" Header="_Exit" />
</MenuItem>
</Menu>
<Grid>
<TabControl x:Name="Items">
<TabControl.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding DisplayName}" />
<Button Content="X"
cal:Message.Attach="DeactivateItemAndTryClose($dataContext, 'true')" />
</StackPanel>
</DataTemplate>
</TabControl.ItemTemplate>
</TabControl>
<!--<ContentControl x:Name="ActiveItem" Margin="20 5 20 20">
</ContentControl>-->
</Grid>
</DockPanel>
</Window>
ShellViewModel.cs
using Caliburn.Micro;
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
namespace CMTabNav.ViewModels
{
public class ShellViewModel : Conductor<object>.Collection.OneActive
{
public ShellViewModel()
{
}
public void PartsList()
{
ActivateItemAsync(IoC.Get<PartsListViewModel>(), new CancellationToken());
DisplayName = "Part List";
}
public void AssembliesList() //AssembliesList
{
ActivateItemAsync(IoC.Get<AssembliesListViewModel>(), new CancellationToken());
DisplayName = "Assembly List";
}
public void Demo()
{
ActivateItemAsync(IoC.Get<DemoViewModel>(), new CancellationToken());
DisplayName = "Demo View";
}
public async Task DeactivateItemAndTryClose(IScreen item, bool close)
{
await DeactivateItemAsync(item, close, new CancellationToken());
}
}
}
PartsListViewModel.cs
using Caliburn.Micro;
using System;
using System.Collections.Generic;
using System.Text;
namespace CMTabNav.ViewModels
{
class PartsListViewModel: Screen
{
}
}
您可以更改视图模型以继承 PropertyChangedBase
class 并实现 IHaveDisplayName
接口,如下所示
class PartsListViewModel : PropertyChangedBase, IHaveDisplayName
{
public string DisplayName { get; set; }
}
根据您的数据模板,DisplayName
应该在选项卡项本身的数据上下文中声明(PartsListViewModel
、DemoViewModel
等),而不是在 ShellViewModel
中声明.您应该在激活任何视图模型之前设置显示名称
public void PartsList()
{
var partsListViewModel = IoC.Get<PartsListViewModel>();
partsListViewModel.DisplayName = "Part List";
ActivateItemAsync(partsListViewModel, new CancellationToken());
}
您还应该更新 DeactivateItemAndTryClose
方法并传递不同类型的参数而不是 IScreen
public async Task DeactivateItemAndTryClose(PropertyChangedBase item, bool close)
{
await DeactivateItemAsync(item, close, new CancellationToken());
}
但是,您可以保留视图模型,继承 Screen
class,仅在激活前为每个视图模型正确设置 DisplayName
,如 PartsList()
上面的方法
参考资料
Github 项目 CMTabNavigation
TargetFramework netcoreapp3.0
PackageReference Caliburn.Micro Version="4.0.105-alpha"
我正在做第一个示例,当用户单击菜单项时在选项卡控件中显示 ViewModel。 该示例工作正常,但选项卡上的显示名称不起作用。你能帮帮我吗
<Window x:Class="CMTabNav.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"
xmlns:cal="http://www.caliburnproject.org"
xmlns:local="clr-namespace:CMTabNav.Views"
mc:Ignorable="d"
Title="ShellView" Height="450" Width="800">
<DockPanel>
<Menu DockPanel.Dock="Top" FontSize="25">
<MenuItem Header="_File">
<MenuItem.Background>
<RadialGradientBrush>
<GradientStop Color="Black" Offset="0"/>
<GradientStop Color="#FFC3C1AD" Offset="0.105"/>
</RadialGradientBrush>
</MenuItem.Background>
<MenuItem x:Name="PartsList" Header="_Parts List" />
<MenuItem x:Name="AssembliesList" Header="_Assembly List" />
<MenuItem x:Name="Demo" Header="_Demo" />
<MenuItem x:Name="ExitApplication" Header="_Exit" />
</MenuItem>
</Menu>
<Grid>
<TabControl x:Name="Items">
<TabControl.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding DisplayName}" />
<Button Content="X"
cal:Message.Attach="DeactivateItemAndTryClose($dataContext, 'true')" />
</StackPanel>
</DataTemplate>
</TabControl.ItemTemplate>
</TabControl>
<!--<ContentControl x:Name="ActiveItem" Margin="20 5 20 20">
</ContentControl>-->
</Grid>
</DockPanel>
</Window>
ShellViewModel.cs
using Caliburn.Micro;
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
namespace CMTabNav.ViewModels
{
public class ShellViewModel : Conductor<object>.Collection.OneActive
{
public ShellViewModel()
{
}
public void PartsList()
{
ActivateItemAsync(IoC.Get<PartsListViewModel>(), new CancellationToken());
DisplayName = "Part List";
}
public void AssembliesList() //AssembliesList
{
ActivateItemAsync(IoC.Get<AssembliesListViewModel>(), new CancellationToken());
DisplayName = "Assembly List";
}
public void Demo()
{
ActivateItemAsync(IoC.Get<DemoViewModel>(), new CancellationToken());
DisplayName = "Demo View";
}
public async Task DeactivateItemAndTryClose(IScreen item, bool close)
{
await DeactivateItemAsync(item, close, new CancellationToken());
}
}
}
PartsListViewModel.cs
using Caliburn.Micro;
using System;
using System.Collections.Generic;
using System.Text;
namespace CMTabNav.ViewModels
{
class PartsListViewModel: Screen
{
}
}
您可以更改视图模型以继承 PropertyChangedBase
class 并实现 IHaveDisplayName
接口,如下所示
class PartsListViewModel : PropertyChangedBase, IHaveDisplayName
{
public string DisplayName { get; set; }
}
根据您的数据模板,DisplayName
应该在选项卡项本身的数据上下文中声明(PartsListViewModel
、DemoViewModel
等),而不是在 ShellViewModel
中声明.您应该在激活任何视图模型之前设置显示名称
public void PartsList()
{
var partsListViewModel = IoC.Get<PartsListViewModel>();
partsListViewModel.DisplayName = "Part List";
ActivateItemAsync(partsListViewModel, new CancellationToken());
}
您还应该更新 DeactivateItemAndTryClose
方法并传递不同类型的参数而不是 IScreen
public async Task DeactivateItemAndTryClose(PropertyChangedBase item, bool close)
{
await DeactivateItemAsync(item, close, new CancellationToken());
}
但是,您可以保留视图模型,继承 Screen
class,仅在激活前为每个视图模型正确设置 DisplayName
,如 PartsList()
上面的方法