ResourceDictionary中的绑定不起作用

时间:2016-11-18 07:18:27

标签: c# .net wpf xaml mvvm

我在ContextMenu中有一个ResourceDictionaryContextMenu应隐藏或显示,具体取决于视图模型属性的值,但它不起作用。

这是我的 XAML 代码(ControlBase来自UserControl):

<control1:ControlBase>
    <UserControl.Resources>
        <ResourceDictionary>
            <HierarchicalDataTemplate ItemsSource="{Binding InfraNetworkItems}">
                <StackPanel>
                    <StackPanel.ContextMenu>
                        <ContextMenu DataContext="{Binding PlacementTarget.DataContext,
                                         RelativeSource={RelativeSource Self}}">
                            <MenuItem Header="Delete"
                                      Visibility="{Binding
                                          DataContext.MyViewModel.DeleteEnabled,
                                          RelativeSource={RelativeSource Mode=FindAncestor,
                                              AncestorType=control1:ControlBase},
                                          Converter={StaticResource
                                              BooleanVisibilityConverter}}" />
                        </ContextMenu>
                    </StackPanel.ContextMenu>
                </StackPanel>
            </HierarchicalDataTemplate>
        </ResourceDictionary>
    </UserControl.Resources>
</control1:ControlBase>

DeleteEnabled是视图模型上的bool属性。

我之前尝试解决问题的依据是这些假设:

ContextMenu位于HierarchicalDataTemplate内,ItemsSource设置ItemSource。我的属性不是此Visibility="{Binding DataContext.MyViewModel.DeleteEnabled, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=control1:ControlBase}, Converter={StaticResource BooleanVisibilityConverter}}" 的成员,它属于视图模型。因此,我尝试过这行代码,但没有任何影响:

DeleteEnabled

但是如果我将ItemSource属性从视图模型复制到Visibility="{Binding DeleteEnabled, Converter={StaticResource BooleanVisibilityConverter}}" 对象,它可以工作:

{{1}}

1 个答案:

答案 0 :(得分:1)

您的视图的DataContext是什么?如果它是MyViewModel的一个实例,则必须更改Binding的路径。 请尝试这个:

<Visibility="{Binding DataContext.DeleteEnabled, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=control1:ControlBase}, Converter={StaticResource BooleanVisibilityConverter}}" />

通过设置DataContext的路径,您已经可以访问viewmodel,当然还可以访问DeleteEnabled-Property。 希望这可以帮助。