【发布时间】:2015-05-31 22:16:25
【问题描述】:
我有一个 TelerikDocking:RadDocumentPane 类型的视图。此视图上的第一个可视元素以及所有其他可视元素的容器是具有 x:Name="MainGrid" 的 Grid。
如果我将 Grid 的一个属性绑定到 ViewModel 上的一个公共属性,即它的 DataContext,它会工作并看到它。
在这个网格内部是一个telerik:RadGridView,它的一列是一个删除按钮,其可见性属性绑定到GridviewRow 的IsSelected 属性。这也很好用。
我需要能够根据在 ViewModel 的公共属性中处理的其他条件覆盖按钮的可见性。为此,我将按钮包装在 StackPanel 中,并尝试将其 Visibility 绑定到 ViewModel 的公共属性,无论我使用什么 RelativeSource 语法,我都无法访问 VieModel 上的该属性。
这是删除按钮的 XAML:
<telerik:GridViewDataColumn>
<telerik:GridViewDataColumn.CellTemplate>
<DataTemplate>
<StackPanel Visibility="{Binding ???}">
<telerik:RadButton Width="70"
Command="telerik:RadGridViewCommands.Delete"
CommandParameter="{Binding}"
Content="Delete"
IsEnabled="{Binding UserHasCofundingRole}"
Visibility="{Binding IsSelected,
RelativeSource={RelativeSource AncestorType={x:Type telerik:GridViewRow}},
Converter={StaticResource booleanToVisibilityConverter}}" />
</StackPanel>
</DataTemplate>
</telerik:GridViewDataColumn.CellTemplate>
</telerik:GridViewDataColumn>
以下是我为 StackPanel 的 Visibility 尝试过的所有绑定语法尝试,但都没有碰到 ViewModel:
{Binding DataContext.DeleteButtonVisible, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type telerikDocking:RadDocumentPane}}, Converter={StaticResource booleanToVisibilityConverter}}
{Binding ViewModel.DeleteButtonVisible, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type telerikDocking:RadDocumentPane}}, Converter={StaticResource booleanToVisibilityConverter}}
{Binding ElementName=MainGrid, Path=DataContext.DeleteButtonVisible, Converter={StaticResource booleanToVisibilityConverter}}
{Binding ElementName=LayoutRoot, Path=ViewModel.DeleteButtonVisible, Converter={StaticResource booleanToVisibilityConverter}}
{Binding RelativeSource={RelativeSource Mode=TemplatedParent}, Path=DataContext.DeleteButtonVisible, Converter={StaticResource booleanToVisibilityConverter}}
【问题讨论】:
-
您是否检查过“输出”窗格中的绑定错误?有用的第一步是排除你的哪些尝试是有效的绑定,哪些只是铺垫。
-
我怀疑这也是值得研究多重绑定的。与其将按钮包装在 StackPanel 中,只需将其当前绑定替换为对 IsSelected 的多重绑定以及其他条件,然后实现转换器以找出可见性逻辑。
-
感谢您的回复!我看过输出。这是真正应该工作的语法的一个输出: System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='Telerik.Windows.Controls.RadDocumentPane', AncestorLevel='1'' . BindingExpression:Path=DataContext.DeleteButtonVisible;数据项=空;目标元素是'StackPanel'(名称='');目标属性是“可见性”(类型“可见性”)
-
我们已经研究了 MultiBinding,但未能成功使用该语法。
-
也许值得打开一个新问题来获得有关多重绑定的一些建议?
标签: wpf xaml binding viewmodel radgridview