我正在尝试在窗口中传播字符串属性以显示标题。
在我的基类中,我使用默认的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));
}
我收到一个显示正确信息的消息框:
注意:多重绑定语法有效。在尝试从BaseWindow
访问它之前,我尝试使用Window的ViewModel中的属性。
基本原理是我想在应用程序中的其他窗口的标题中显示子系统名称,例如“我的应用程序 - 窗口小部件系统”。只有子系统VM中的子系统名称。
答案 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}
引用它们。最干净的选择是第一个,因为视图不应包含数据。