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

时间:2018-07-09 14:13:38

标签: c# wpf xaml data-binding

我有以下配置:

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控件上,所以我有

OptionsWindows.xaml

<CheckBox 
  Content="Quiet Mode" 
  DataContext="{Binding ElementName=mainWindow, Path=Options}"
  IsChecked="{Binding Path=QuietMode}"
/>

尽管我可以解决这个问题,但它却行不通(我尝试了多种类似的方法,但到目前为止都没有奏效)。由于我对WPF还是很陌生,所以我认为这里显然缺少一些东西。

1 个答案:

答案 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

但是请记住,没有“正确的方法”来做到这一点。不幸的是,您必须决定最适合您的方法。