C# 将VM设置为继承屏幕时,会覆盖视图中的标题字段

C# 将VM设置为继承屏幕时,会覆盖视图中的标题字段,c#,wpf,mvvm,caliburn.micro,C#,Wpf,Mvvm,Caliburn.micro,如果我有这样一个ViewModel: public class ViewModel : IPropertyChangeBase, IViewModel { } 我在绑定到的视图的xaml中设置的“Title”属性正确显示 如果让ViewModel从屏幕继承,则标题中显示的是ViewModel的完整类型名称,如“MarksProject.ViewModels.ViewModel”。这将显示在窗口标题上 //View Title property being overriden. pub

如果我有这样一个ViewModel:

 public class ViewModel : IPropertyChangeBase, IViewModel
 {
 }
我在绑定到的视图的xaml中设置的“Title”属性正确显示

如果让ViewModel从屏幕继承,则标题中显示的是ViewModel的完整类型名称,如“MarksProject.ViewModels.ViewModel”。这将显示在窗口标题上

 //View Title property being overriden.
 public class ViewModel : Screen, IViewModel
 {
 }

Screen定义Caliburn.Micro用于自动填充标题的属性DisplayName。只需在构造函数中设置如下:

public ViewModel() {
    this.DisplayName = "MyTitle";
}

您将收回您的标题-并在过程中保存了一个属性;)

从构造函数调用虚拟成员(
DisplayName
)通常是个坏主意,如@T045T的答案所示。这是一种更安全的方法:

public class ViewModel : Screen
{
    public override string DisplayName
    {
        get { return "View Title"; }
        set { }
    }
}

请注意,需要
set{}
来避免
Mode=TwoWay
绑定错误。

我通常喜欢将模型对象存储在ViewModel中,并将其字段包装在ViewModel属性中。如果我想将名称包装到DisplayName属性中,Conducotrs会试图覆盖它,这真的很糟糕。我认为IHaveDisplayName接口应该只有一个getter而没有setter。