【问题标题】:How to bind to an owning window's control-property (from a dialog window)?如何绑定到拥有窗口的控件属性(从对话框窗口)?
【发布时间】:2011-09-27 12:36:07
【问题描述】:

朋友们,

我在 WPF 中遇到了一个我无法解决的问题。我有两个窗口,MainwindowWindow1。我想将子窗口中的 ListView 绑定到父窗口中的控件属性。详细:

主窗口有一个在 XAML 中声明的控件,

<local:MyControl x:Name="View"/>

再往下,我有一个 Listview,它由“View”、“Session.Events”(可观察集合)的公共属性提供数据

<ListView ItemsSource="{Binding ElementName=View, Path=Session.Events}"/>

效果很好,但现在我有第二个窗口以这种方式从主窗口产生:

Window1 MyWin1 = new Window1();
MyWin1.Owner = this;
MyWin1.ShowDialog();

第二个窗口有一个 ListView,它也需要由我的“View”控件提供。我想通过装订来做到这一点,但我咬牙切齿。它不起作用,无论我尝试什么。我确实有一个通过代码隐藏的工作版本...

Window1 Parent = (Window1)this.Owner;
MyListView.ItemsSource = Parent.CCView.Session.Events;

但我更喜欢在 XAML 中进行绑定并保存额外代码。我也希望它能帮助我更好地理解绑定,这在某种程度上对我来说仍然是一个谜。

非常感谢您和我最诚挚的问候,
保罗

【问题讨论】:

    标签: c# wpf xaml data-binding


    【解决方案1】:

    您可以跨 XAML 的逻辑树进行绑定。第二个窗口不是第一个窗口树的一部分。我认为在您的情况下最简单的方法应该是将 DataContext 传递给您的子窗口:

    MyWin1 = new Window1 {
      DataContext = this.DataContext,
      Owner = this 
    };
    MyWin1.ShowDialog();
    

    【讨论】:

    • 您好 flq,感谢您的提示!我包括了它,但我如何在 Window1 中执行实际绑定?我尝试了 ItemsSource="{Binding ElementName=View, Path=Session.Events}" 和其他一些东西,但我无法让它工作......
    • hm,看起来您没有使用 DataContext?但是,这样您就知道绑定指的是什么,这将是有道理的。如果例如您的 DataContext 是 Session,绑定是 {Binding Events} - DataContext 一直沿逻辑树继承
    • 还有一个问题,为什么会这样:Win1.DataContext = this.View; ItemsSource="{Binding Path=Session.Events} 有效,但无效:Win1.DataContext = this; ItemsSource="{Binding Path=View.Session.Events}" ?
    • 可能是“视图”是作为私有/内部成员生成的,因此从外部看不到
    • 我尝试将 x:Fieldmodifier 设置为 public,但仍然没有成功。但现在它开始变得有意义了,XAML 编译器声明字段(或者我认为),而不是属性 - 标准的 WPF 不能访问字段。如果我在“this”提供的一般 DataContext 中绑定到一个属性,比如 Title,它就可以工作。再次感谢,今天学到了很多。 (-:
    猜你喜欢
    • 2013-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-17
    • 1970-01-01
    • 1970-01-01
    • 2019-01-01
    相关资源
    最近更新 更多