【发布时间】:2015-07-14 06:21:48
【问题描述】:
我发现需要绑定到 Page 的 DataContext,设置如下:
<d:Page.DataContext>
<designTime:PayeesPageDesignViewModel />
</d:Page.DataContext>
在设计时。但是,我需要从具有不同数据上下文的子控件绑定到它:
<GridView x:Name="PayeesGridView"
Margin="0,30,0,0"
IsItemClickEnabled="True"
ItemsSource="{Binding Payees}"
SelectionChanged="PayeesGridView_OnSelectionChanged">
由于为GridView 设置了ItemsSource,因此我的GridViewItems 的DataContext 设置为Payee 集合中的单个Payee 对象。我的ViewModel 有一个属性,我需要从转换器中的View 引用该属性以确定项目的可见性。
我可以根据Payee 对象的属性设置可见性,如下所示:
<Border Width="250"
Height="250"
Background="Gray"
Opacity="0.85"
Visibility="{Binding Path=IsOpen,
Converter={StaticResource AccountStatusToVisibilityConverter}}">
但我真正需要绑定的是Page 的DataContext 的Settings.ShowInactive 属性。有没有办法从子控件中获取该上下文?我使用的是 WinRT,所以我没有 FindAncestor 绑定源的好处。
编辑
按照 cmets 中的建议,我尝试将绑定更改为如下所示:
Visibility="{Binding Path=DataContext.Settings.ShowInactivePayees, ElementName=PageName,
Converter={StaticResource AccountStatusToVisibilityConverter}}">
但是当我在AccountStatusToVisibilityConverter 中设置断点时,转换器永远无法到达。
【问题讨论】:
-
给页面一个
x:Name并使用ElementName绑定? -
啊,谢谢。我知道有办法做到这一点,但我想不通。这就是我在半夜编程所得到的:)我正在尝试绑定
ElementName="PageName.DataContext"和Path="Settings.ShowInactivePayees",但被传递的是null,即使DesignTimeViewModel被硬编码为false和我在运行时尝试将ShowInactivePayees设置为true或false。 -
PageName.DataContext不是元素名称。你的绑定应该看起来像{Binding Path=DataContext.Settings.ShowInactive, ElementName=PageName}。 -
我以为
ElementName="PageName.DataContext" Path="Settings.ShowInactivePayees"和ElementName="PageName" Path="DataContext.Settings.ShowInactivePayees"是一样的?无论如何,无论ShowInactivePayees的值如何,我仍然将null作为传递的值。 -
我在我的问题中添加了绑定现在的样子。现在转换器甚至没有启动。我正在设置
x:Name="PageName"并且编译器正在识别所有内容,但我不明白为什么转换器不再触发。
标签: c# xaml windows-runtime winrt-xaml