如何将DataTemplate元素的可见性绑定到祖先元素的ViewModel属性?

时间:2016-08-02 16:37:52

标签: c# mvvm binding uwp visibility

我有一个DataTemplate:

    <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}" />

我在comboBox中使用上面的数据模板选择器:

        <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堆栈面板。

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

我不能使用相对路径祖先类型来查找我的comboBox或堆栈面板,似乎我只能在我的相对源中使用self或TemplateParent。我使用silverlight。

谢谢!

1 个答案:

答案 0 :(得分:1)

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

假设您的商品容器是ListBox

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

在UWP应用中,RelativeSource不可用,您可以使用ElementName代替。

首先,命名项目控件:

<ComboBox Name="MyComboBox" />

然后,在绑定中使用它:

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