如果您试图从一个“逃逸”ItemsControl
或DataGridView
到达一个Window
,您可能会发现 AncestorType ofx:Type Window
不起作用。或者至少似乎没有...
如果是这种情况,您可能正在运行 Blend 或 Visual Studio,并希望数据在设计时可见 - 但事实并非如此,因为 VS + Blend 都创建了自己的实例,这些实例并不是真正的 Windows。它可以在运行时正常工作,但不能在设计模式下工作。
你可以做几件事:
包装在用户控件中
这是我想出的另一种解决方案。它的一个优点是您没有直接引用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}}" />
注意:如果您想绑定到 ON Window 本身的属性,那就更棘手了,您可能应该通过依赖属性或类似的东西进行绑定。但是,如果您使用的是 MVVM,那么这是我找到的一种解决方案。