Caliburn Mico:Screen的ActivateItem.DisplayName属性不会自动绑定到Window Title

时间:2014-04-28 12:09:48

标签: wpf caliburn.micro

我想弄清楚为什么Caliburn.Micro没有将我的Screen DisplayName属性绑定到开箱即用的Window Title。

我读过这篇文章: https://stackoverflow.com/a/9072035/2111892 那么,如果不手动操作就不应该绑定它?

我的指挥看起来像这样:

[Export(typeof (ShellViewModel))]
public class ShellViewModel : Conductor<Screen>, IHandle<IViewModelMessage>
{
    [ImportMany(typeof (IViewModelMessageHandler))]
    private IEnumerable<IViewModelMessageHandler> _messageHandlers;

    [ImportingConstructor]
    public ShellViewModel(IEventAggregator eventAggregator)
    {
        eventAggregator.Subscribe(this);
    }

    protected override void OnActivate()
    {
        var viewModel = IoC.Get<LoginViewModel>();
        ActivateItem(viewModel);
    }
}

...虽然我的屏幕看起来像这样:

[Export(typeof(LoginViewModel))]
public class LoginViewModel : Screen
{
    [ImportingConstructor]
    public LoginViewModel(IEventAggregator eventAggregator, IMessageService messageService, IClient client, IClientReceiver receiver, IClientTransceiver transceiver)
    {
        DisplayName = "Login";
    }
}

我犯了错误或者我是否理解错误?

编辑:\

ShellView btw看起来像这样:

<UserControl x:Class="Test.Client.Gui.Views.ShellView"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Height="900"
    Width="1000">
<Grid VerticalAlignment="Center">
    <ContentControl x:Name="ActiveItem" />
</Grid>
</UserControl>

2 个答案:

答案 0 :(得分:2)

Title将绑定到ShellViewModel的DisplayName,而不是绑定到您在其中创建的任何视图模型。每当激活子视图模型时,您都必须更改DisplayName。或者使用Title =“{Binding ActiveItem.DisplayName}”显式绑定它。

答案 1 :(得分:0)

当你有像这样的指挥时,我实际上喜欢以下解决方案

<Window>
    <Window.Title >
        <PriorityBinding>
            <Binding Path="ActiveItem.DisplayName" Converter="{StaticResource NullToUnsetConverter}"></Binding>
            <Binding Path="DisplayName"></Binding>
        </PriorityBinding>
    </Window.Title>
</Window>
如果活动项将其自己的displayname设置为null,则

NullToUnsetConverter只允许绑定通过。如果你不需要这种行为,你可以完全省略它。