【问题标题】:How to binding DataTemplate element's visibility to ancestor element's ViewModel property? [duplicate]如何将 DataTemplate 元素的可见性绑定到祖先元素的 ViewModel 属性? [复制]
【发布时间】:2016-12-08 03:22:30
【问题描述】:

我有一个数据模板:

    <DataTemplate x:Key="BMSelectedItemTemplate">
        <StackPanel Orientation="Horizontal">
            <TextBlock Text="*" Visibility=???/>
            <TextBlock Text="{Binding Name}"/>
        </StackPanel>
    </DataTemplate>

我有一个使用上述模板的 DataTemplateSelector:

    <BookmarkItemDataTemplateSelector x:Key="BookmarkItemDataTemplateSelector" SelectedItemTemplate="{StaticResource BMSelectedItemTemplate}" 
                                                                                      DropdownItemsTemplate="{StaticResource BMDropdownItemTemplate}" />

我在组合框中使用上述数据模板选择器:

        <StackPanel x:Name="splBookmark" Visibility="{Binding ShowBookmark, Converter={StaticResource BooleanToVisibilityConverter}}">
            <ComboBox x:Name="cbBookmark" ItemTemplateSelector="{StaticResource BookmarkItemDataTemplateSelector}"/>
        </StackPanel>

我的视图模型具有属性 ShowBookmark 和 ShowAsterisk。我想将 BMSelectedItemTemplate 中“*”的可见性绑定到我的视图模型的属性 ShowAsterisk。我怎么能那样做?我试过了:

Visibility="{Binding ShowAsterisk, Converter={StaticResource BooleanToVisibilityConverter}}"

但是没有用,它说数据模板找不到属性ShowAsterisk,我认为这是有道理的,因为数据模板绑定到MBookmark对象列表,而在我的MBookmark类中,没有ShowAsterisk的属性. ShowAsterisk 是绑定到 splBookmark 堆栈面板的视图模型的属性。

我的问题是如何将祖先元素的视图模型属性绑定到我的数据模板元素的可见性?

我无法使用相对路径祖先类型来查找我的组合框或堆栈面板,看来我只能在我的相对源中使用 self 或 TemplateParent。我用的是银光。

谢谢!

【问题讨论】:

  • 有关如何绑定到当前元素的父视图模型的几个 Stack Overflow 问题之一的示例,请参阅标记的副本。
  • 您好,我看看重复的问题,但似乎我无法在绑定中使用相对源,它在 RelativeSource 中找不到 AncestorType 属性。我还有其他方法可以访问 splBookmark 吗?
  • 听起来您没有正确键入绑定。但是如果没有一个好的minimal reproducible example 可以可靠地重现您的问题,就不可能确定问题是什么。我可以向你保证,RelativeSource 确实有效,只要你正确使用它。
  • 谢谢彼得,我也很困惑,因为当我使用 AncestorType 时,它​​会抱怨“无法识别或无法访问成员 AncestorType”。我仍在努力弄清楚为什么会发生这种情况。
  • 嗨,彼得,我编辑了我的帖子。我认为这可能与它是一个 UWP 应用程序有关,我看到了这个:social.msdn.microsoft.com/Forums/vstudio/en-US/…

标签: c# mvvm binding uwp visibility


【解决方案1】:

在 WPF 中,您可以使用RelativeSource 爬上视觉树。

假设您的物品容器是ListBox:

Visibility="{Binding RelativeSource={RelativeSource AncestorType=ListBox}, 
                     Path=DataContext.ShowAsterisk,
                     Converter={StaticResource BooleanToVisibilityConverter}}"

在 RelativeSource 不可用的 UWP 应用中,您可以改用 ElementName。

首先,命名项目控件:

<ComboBox Name="MyComboBox" />

然后,在绑定中使用它:

Visibility="{Binding ElementName=MyComboBox, 
                     Path=DataContext.ShowAsterisk,
                     Converter={StaticResource BooleanToVisibilityConverter}}"

【讨论】:

  • 我的项目容器是一个组合框,组合框位于堆栈面板上。我无法使用上面的代码来查找 ComboBox,因为它抱怨 AncestorType 不是 RelativeSource 的属性。你知道有什么原因会导致这种情况吗?
  • 这是 UWP(商店)应用还是 WPF 应用?
  • 这是一个 UWP 应用。
  • 你应该确保你的问题标签是正确的:)
  • 感谢 Eli 指出这一点!
猜你喜欢
  • 2021-05-06
  • 2015-08-23
  • 2017-02-26
  • 2016-06-28
  • 1970-01-01
  • 2011-02-23
  • 1970-01-01
  • 1970-01-01
  • 2014-02-27
相关资源
最近更新 更多