【问题标题】:Window title is overwritten when using Caliburn's conductor<object> in view model在视图模型中使用 Caliburn 的conductor<object> 时,窗口标题被覆盖
【发布时间】:2015-06-20 18:17:57
【问题描述】:

Caliburn 和 WPF MVVM 的新手,所以我可能忽略了一些非常简单的东西,我在网上找不到任何东西。

使用 Caliburn.Micro 设置一个简单的 wpf 项目。在 ShellView.xaml 中设置窗口标题。工作正常。主 MetroWindow 按预期显示标题。

工作正常:

[Export(typeof (IShell))]
public class ShellViewModel : PropertyChangedBased, IShell
{}

但改为:

[Export(typeof (IShell))]
public class ShellViewModel : Conductor<object>
{}

并且 Window title 是此 ViewModel 的完全限定名称。任何帮助,将不胜感激。谢谢。

【问题讨论】:

    标签: c# wpf mvvm viewmodel caliburn


    【解决方案1】:

    你可以这样使用它:

    [Export(typeof (IShell))]
    public class ShellViewModel : Conductor<IScreen>
    {
        public ShellViewModel()
        {
            DisplayName = "Your window title";
        }
    }
    

    在我的存储库中,您可以找到一些使用 Caliburn.Micro 在 WPF 中的应用程序,例如:

    【讨论】:

    • 感谢您的链接和建议。还是一样。应该提到我正在使用 Caliburn.Micro 2.02。在您的引导程序中注意到您使用的是 1.5.2。
    • 你能展示你的项目吗?我准备了一个带有新版本的示例应用程序,它可以工作。你见过这个documentation吗? (我得走了,明天我会尽力帮忙的)。
    【解决方案2】:

    感谢 Wojciech 为我指明了正确的方向。

    当 ShellViewModel 继承 PropertyChangeBase 和 IShell 时,在 ShellView.xaml 中设置 Title = "Window Title" 有效。但是,当使用 Caliburn.Micro 2.0.2 并从 Conductor(单屏导体)继承时,窗口标题会被视图模型的完全限定名称覆盖(在我的例子中):

    FBAGOLDEVALUATOR.APP.VIEWMODELS.SHELLVIEWMODEL
    

    这看起来像是 Caliburn.Micro v2.02 中的错误,除非我遗漏了什么。

    解决方法:将 .xaml 中窗口的 Title 属性绑定到 ViewModel 中的公共属性。 .xaml 行:

    Title="{Binding Path=DisplayTitle, Mode=OneWay}" 
    

    ShellViewModel.cs 中的属性:

        private string _displayTitle;
        public String DisplayTitle
        {
            get
            {
                return _displayTitle;
            }
            set
            {
                if (value.Equals(_displayTitle)) return;
                _displayTitle = value;
                NotifyOfPropertyChange(() => DisplayName);
            }
        }
    

    然后在 ShellViewModel 构造函数中设置:

    DisplayTitle = "FBA Gold Evaluator";
    

    这似乎行得通。

    【讨论】:

    • 我编辑了您的答案,添加了一个小修复程序以防止在 setter 中出现空引用异常;-)。您确定设置“DisplayName”不起作用吗?您是否先从 XAML 中删除标题?
    • 你是对的!从 XAML 中删除 Title 并在 ModelView 构造函数中设置 DisplayName = "New Title" 效果很好。我完全错过了。我想同时学习 XAML、WPF、MVVM 和 Caliburn.Micro 是个坏主意。对不起,我开枪了。我如何将您的条目重新标记为答案?谢谢。
    • 刚刚检查了你的答案。再次感谢。
    猜你喜欢
    • 2012-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多