我有以下配置:
<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还是很陌生,所以我认为这里显然缺少一些东西。
答案 0 :(得分:2)
与ElementName
的绑定仅在同一UserControl中起作用。如果两个Windows完全分开,则除了将Options属性从MainWindow类移动到适当的Model或ViewModel类之外,您别无选择,无论如何都应该这样做,因为这就是WPF / MVVM的方式。
如果您真的要从一个视图绑定到另一个视图,则不同的Window实例至少应共享一些共同的祖先,以便可以使用ElementName
代替FindAncestor
BootStrapper
绑定参数,但是我怀疑这是一个简单,自然或什至可能的解决方案。 (我认为这是不可能的,因为Window是一个“顶部控件”,在Logical or Visual Trees中没有父控件。
到目前为止,最好的解决方案是尽快从View中移走模型数据,您将获得一个更轻松的环境来进行改进。
更新:某些MVVM上下文:
通常,在WPF应用程序中,有些类与“ View”层有关(Windows,Controls,CheckBoxes),而另一些类与“ [View] Model”层有关,因此需要在其中放置Option类。您需要以一种方式来引导您的应用程序,以便在启动执行后不久就拥有一个View实例和一个ViewModel实例,而后者应设置为前者的DataContext,这样您就可以使用数据绑定。
"View-First" vs "Model-First" approach周围发生了一些宗教战争,但我都不使用:我总是有一个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();
}
}
类来创建MainView(通常是Window)和MainViewModel,并让每个类树本身。
一个例子:
prototype
但是请记住,没有“正确的方法”来做到这一点。不幸的是,您必须决定最适合您的方法。