22

我目前正在使用 WPF 用户控件(我的 XAML 文件的根元素是“UserControl”),我知道它托管在一个窗口中。如何使用数据绑定访问 Window 的属性?

有谁知道为什么简单

<Binding RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type Window}}" Path="..." />

不工作?我得到的错误信息是:

System.Windows.Data 警告:4:无法通过引用“RelativeSource FindAncestor,AncestorType='System.Windows.Window',AncestorLevel='1'”找到绑定源。

编辑:我最终使用了 ArsenMkrt 方法的变体,所以接受了他的回答。但是,我仍然有兴趣找出 FindAncestor 不能“正常工作”的原因。

4

4 回答 4

20

最好的方法是给 UserControl 起个名字

使用两种方式绑定在 UserControl 中创建依赖属性 MyProperty 并将其绑定在主窗口中,而不是像这样在 UserControl 中绑定

<UserControl x:Name = "myControl">
     <Label Content={Binding ElementName= myControl, Path=MyProperty}/>
</UserControl>
于 2009-10-28T12:04:39.447 回答
5

如果您试图从一个“逃逸”ItemsControlDataGridView到达一个Window,您可能会发现 AncestorType ofx:Type Window不起作用。或者至少似乎没有...

如果是这种情况,您可能正在运行 Blend 或 Visual Studio,并希望数据在设计时可见 - 但事实并非如此,因为 VS + Blend 都创建了自己的实例,这些实例并不是真正的 Windows。它可以在运行时正常工作,但不能在设计模式下工作。

你可以做几件事:

  • 包装在用户控件中

  • 这是我想出的另一种解决方案。它的一个优点是您没有直接引用UserControlWindow,因此如果您更改父容器,您的代码不会中断。

    <Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:views="clr-namespace:MyWPFApplication.Views"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"                  
    x:Class="MyWPFApplication.Views.UPCLabelPrinterWindow"
    mc:Ignorable="d"
    x:Name="LayoutRoot"
    Title="UPCLabelPrinterWindow">
    
    <views:DataContextWrapper>
        <DockPanel>
            ...
        </DockPanel>
    </views:DataContextWrapper>
    

哪里DataContextWrapper只是一个网格

namespace MyWPFApplication.Views {
   public class DataContextWrapper : Grid
   {

   }
}

然后当你绑定你这样做:

<TextBlock Text="{Binding="{Binding DataContext.SomeText, 
  RelativeSource={RelativeSource AncestorType={x:Type views:DataContextWrapper}, 
  Mode=FindAncestor}}" />

注意:如果您想绑定到 ON Window 本身的属性,那就更棘手了,您可能应该通过依赖属性或类似的东西进行绑定。但是,如果您使用的是 MVVM,那么这是我找到的一种解决方案。

于 2011-11-16T04:47:58.897 回答
1

我认为你应该 SET Mode="OneWayToSource" 像这样:

<TextBox Text="{Binding RelativeSource={RelativeSource FindAncestor ,AncestorType={x:Type Grid}},Path=BackGround , Mode=OneWayToSource , UpdateSourceTrigger = PropertyChanged}" />
于 2011-04-20T16:32:57.533 回答
0

如果您使用视图模型作为 Window 的 DataContext,并且您需要绑定的属性来自该视图模型,那么您应该在路径前加上 DataContext.MyPropertyPath,如下所示:

<TextBox Text="{Binding DataContext.MyProperty, RelativeSource={RelativeSource AncestorType={x:Type Window}, Mode=FindAncestor}}"/>

这翻译为“为我找到一个祖先窗口,然后在它的数据上下文中查找 MyProperty”

于 2020-09-02T20:46:57.963 回答