我目前一个WPF用户控件中工作(我的XAML文件的根元素是“用户控件”),我知道一个窗口内正在举行。 我如何使用数据绑定窗口的属性?
有谁知道为什么简单
<Binding RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type Window}}" Path="..." />
不工作? 该错误消息我得到的是:
System.Windows.Data警告:4:不能用于与参考 '的RelativeSource FindAncestor,AncestorType =' 结合找到源System.Windows.Window 'AncestorLevel = '1''。
编辑:我结束了使用上ArsenMkrt的方式的变化,因此接受了他的答案。 然而,我在找出为什么FindAncestor不“只是工作”仍然有兴趣。
最好的办法是给一个名称,用户控件
具有双向约束力创建用户控件依赖myProperty的属性,并将其绑定在主窗口中,比绑定在用户控件这样
<UserControl x:Name = "myControl">
<Label Content={Binding ElementName= myControl, Path=MyProperty}/>
</UserControl>
如果你想从“逃离” ItemsControl
或DataGridView
得到一个Window
,你可以找到的是AncestorType x:Type Window
不起作用。 或至少似乎并不...
如果这是你可能运行的混合或Visual Studio和期待的数据是在设计时看到的情况 - 它不会因为VS +混合既创造自己的情况下,这是不是真的窗口。 它会在运行时工作得很好,但不是在设计模式。
有几件事情可以做:
裹在用户控件
这里有一个替代的解决方案,我想出了。 它有一个优点,因为你没有引用一个UserControl
或Window
直接,因此,如果您更改父容器你的代码不会打破。
<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}}" />
注意:如果你想绑定到窗口本身的属性很棘手,你应该通过一个依赖属性或类似的东西可能结合。 但是,如果你正在使用MVVM那么这是一个解决方案,我发现。
我想你应该设置模式=“OneWayToSource”像这样:
<TextBox Text="{Binding RelativeSource={RelativeSource FindAncestor ,AncestorType={x:Type Grid}},Path=BackGround , Mode=OneWayToSource , UpdateSourceTrigger = PropertyChanged}" />