繁体   English   中英

WPF绑定到另一个窗口的属性

[英]WPF Binding to a property of another window

我有以下配置:

MainWindow.xaml

<Window x:Class="MYNS.MainWindow"
        mc:Ignorable="d"
        x:Name="mainWindow"
        ...

MainWindow.xaml.cs

public partial class MainWindow : Window
{
    public Options Options { get; private set; }

    public MainWindow()
    {
        Options = new Options();
    }
}

Options.xaml

class Options 
{
    public bool QuietMode { get; set; }

    public Options()
    {
        QuietMode = true;
    }
}

现在我想将此布尔值绑定到另一个窗口的CheckBox控件,所以我有

选项Windows.xaml

<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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM