WPF继承基本属性

时间:2018-03-08 05:55:58

标签: c# wpf inheritance

我正在尝试在窗口中传播字符串属性以显示标题。

在我的基类中,我使用默认的get / set设置了一个公共字符串属性。

在我继承基类的窗口中,我尝试将该属性用作Window的标题。这失败了。但是,当我弹出一个消息框时,我肯定可以访问该属性。

如何在WPF窗口中显示基类的字符串属性?

代码:

BaseWindow.cs:

public class BaseWindow : Window
{
  public string AppTitle { get; set; }
  public string AppVersion { get; set; }

  public BaseWindow()
  {
    AppTitle = "My Application";
    AppVersion = "2.1";
  }
  ... 
}

MainWindow.xaml:

<src:BaseWindow x:Class=... >
  <Window.Title>
    <MultiBinding StringFormat="{}{0} - v{1}">
      <Binding Path="AppTitle" />
      <Binding Path="AppVersion" />
    </MultiBinding>
  </Window.Title>

这不会在MainWindow中显示任何标题。

然而,在MainWindow的CodeBehind:

中有这个
public MainWindow() : base()
{
  InitializeComponent();
  DataContext = new MainViewModel(new MyEntities());
  System.Windows.Forms.MessageBox.Show(string.Format("App: {0}, v: {1}",
      AppTitle, AppVersion));
}

我收到一个显示正确信息的消息框:

enter image description here

注意:多重绑定语法有效。在尝试从BaseWindow访问它之前,我尝试使用Window的ViewModel中的属性。

基本原理是我想在应用程序中的其他窗口的标题中显示子系统名称,例如“我的应用程序 - 窗口小部件系统”。只有子系统VM中的子系统名称。

2 个答案:

答案 0 :(得分:1)

MainWindow的XAML代码中的绑定是指此窗口的DataContext。这被设置为MainWindowModel。因此框架尝试绑定到AppTitle对象的属性MainWindowModel。但是您的属性是在窗口类中定义的。

所以你必须要理解:绑定不绑定到自己类的属性,而是绑定到你设置的DataContext的属性。

您可以在窗口构造函数中设置DataContext=this。这将显示标题,但当然它会违背你的意图。

更好地使用RelativeSource Bindings:

<MultiBinding StringFormat="{}{0} - v{1}">
    <Binding Path="AppTitle" RelativeSource="{RelativeSource Self}"/>
    <Binding Path="AppVersion" RelativeSource="{RelativeSource Self}"/>
</MultiBinding>

请注意,这种方式不会反映构造函数调用后AppTitle和AppVersion的更改。因此,您应该将这些属性设置器设为私有(或受保护)。

如果您想在之后更改属性,则必须使用依赖项属性或实现INotifyPropertyChanged。

答案 1 :(得分:-1)

您的属性是在视图中定义的,而不是您的视图模型,它是用于绑定的DataContext。

将属性移动到(基础)视图模型,或者可以将它们设置为静态,并在绑定中通过{x:Static viewNamespace:BaseWindow.AppVersion}引用它们。最干净的选择是第一个,因为视图不应包含数据。