【问题标题】:Unable to Bind to ViewModel from within a RadGridView GridViewDataColumn CellTemplate无法从 RadGridView GridViewDataColumn CellTemplate 中绑定到 ViewModel
【发布时间】: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


【解决方案1】:

尝试像这样绑定:

{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}, Path= DataContext.YourPublicProp}

如果您在窗口或页面中,或者在其他情况下,请将“UserControl”替换为正确的类型。

【讨论】:

  • 感谢您的建议,但我已经尝试了确切的语法,但它仍然没有命中属性。类型是 x:Type telerikDocking:RadDocumentPane。
  • 不是telerik控件,而是容器控件,用户控件:)请尝试我给它的确切代码:)你需要绑定到用户控件的数据源,VM中定义的所有属性
  • 我也有同样的问题。 ElementName=Root, DataContext.Whatever 绑定也不适用于自定义单元格模板中的 Telerik 的 GridView。从 2018 年开始,他们的论坛上有一个未解决的问题。
猜你喜欢
  • 2012-03-18
  • 1970-01-01
  • 1970-01-01
  • 2014-08-26
  • 2019-04-25
  • 2018-05-10
  • 1970-01-01
  • 1970-01-01
  • 2015-03-21
相关资源
最近更新 更多