[英]WPF Binding to a property of another window
我有以下配置:
<Window x:Class="MYNS.MainWindow"
mc:Ignorable="d"
x:Name="mainWindow"
...
public partial class MainWindow : Window
{
public Options Options { get; private set; }
public MainWindow()
{
Options = new Options();
}
}
class Options
{
public bool QuietMode { get; set; }
public Options()
{
QuietMode = true;
}
}
现在我想将此布尔值绑定到另一个窗口的CheckBox
控件,所以我有
<CheckBox
Content="Quiet Mode"
DataContext="{Binding ElementName=mainWindow, Path=Options}"
IsChecked="{Binding Path=QuietMode}"
/>
尽管我打算做到这一点,但它不起作用(我尝试了多种类似方法,但到目前为止都没有奏效)。 由于我对WPF不太了解,因此我认为这里显然缺少一些东西。
与ElementName
绑定只能在同一UserControl中使用。 如果两个Windows完全分开,则除了将Options属性从MainWindow类移动到适当的Model或ViewModel类之外,您别无选择,无论如何都应该这样做,因为这就是WPF / MVVM的方式。
如果您真的想从一个视图绑定到另一个视图,则不同的Window实例至少应该共享一些共同的祖先,以便可以使用FindAncestor
Binding参数代替ElementName
,但是我怀疑这是否简单,或者自然的,甚至可能的解决方案。 (我认为这是不可能的,因为Window是一个“顶部控件”,在Logical或Visual Trees中没有父级。
迄今为止,最好的解决方案是尽快从View中移走模型数据,您将获得一个更轻松的环境来进行改进。
更新:一些MVVM上下文:
通常,在WPF应用程序中,有些类与“视图”层有关(Windows,Controls,CheckBoxes),而另一些类与“ [View] Model”层有关,因此需要在其中放置Option类。 您需要以一种方式来引导您的应用程序,以便在启动执行后不久就拥有一个View实例和一个ViewModel实例,而后者应设置为前者的DataContext,这样您就可以使用数据绑定。
“ View-First”与“ Model-First”方法之间存在一些宗教冲突,但我都不使用:我总是有一个BootStrapper
类,用于创建MainView(通常是Window)和MainViewModel,并让每个类树本身。
例子:
public partial class App : Application
{
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
var window = new MainWindow();
var vm = new MainViewModel();
window.DataContext = vm;
window.Show();
}
}
但是请记住,没有“正确的方法”来做到这一点。 不幸的是,您必须决定最适合您的方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.