绑定到 UserControl XAML 中的依赖属性

Posted

技术标签:

【中文标题】绑定到 UserControl XAML 中的依赖属性【英文标题】:Binding to a Dependency Property inside UserControl XAML 【发布时间】:2017-12-18 15:33:49 【问题描述】:

我想重用一个控件,但其中一种情况需要上下文菜单,而其他情况则不需要。这是我的尝试。

public partial class RP8Grid : UserControl 

    public bool UseContextMenu 
        get  return (bool)GetValue(UseContextMenuProperty); 
        set  SetValue(UseContextMenuProperty, value); 
    

    // Using a DependencyProperty as the backing store for UseContextMenu.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty UseContextMenuProperty =
        DependencyProperty.Register("UseContextMenu", typeof(bool), typeof(RP8Grid), new PropertyMetadata(false));

        public RP8Grid() 
            InitializeComponent();
        
    

并在 XAML 中使用该属性:

<ctls:RP8Grid UseContextMenu="False"/>

现在我无法解决的部分,如何访问 UserControl 中的 UseContextMenu? 我尝试了以下方法:

<DataGrid>
  <DataGrid.ContextMenu>
    <ContextMenu IsEnabled="Binding UseContextMenu,RelativeSource=RelativeSource AncestorType=UserControl, Mode=FindAncestor">
  </DataGrid.ContextMenu>
</DataGrid>

结果:

找不到与引用“RelativeSource”绑定的源 FindAncestor, AncestorType='System.Windows.Controls.UserControl', AncestorLevel='1'

【问题讨论】:

你说得对,我想我打的是 propa 而不是 propdp。我的第一个实现。 RelativeSource,然后通过祖先链? &lt;ContextMenu IsEnabled=Binding UseContextMenu, RelativeSource=RelativeSource AncestorType=UserControl" /&gt; 找不到,已用我的尝试更新了问题 对,ContextMenus 不在可视化树中;我的错。我可以用binding proxy 做到这一点(这个答案说明了用一个做其他事情)。然而,禁用上下文菜单是有问题的:它仍然打开,但所有项目都被禁用——而且它没有正确关闭。给你的 DataGrid 一个 Style 可能会更好,当该属性为 true 时,它​​会为其分配上下文菜单。 啊,好主意。我去看看这个代理,谢谢。 【参考方案1】:

如果您想要的只是有时摆脱ContextMenu,这将起作用:

<DataGrid 
    >
    <DataGrid.Style>
        <Style TargetType="DataGrid" BasedOn="StaticResource x:Type DataGrid">
            <Style.Triggers>
                <DataTrigger 
                    Binding="Binding UseContextMenu, RelativeSource=RelativeSource AncestorType=UserControl"
                    Value="True"
                    >
                    <Setter Property="ContextMenu">
                        <Setter.Value>
                            <ContextMenu 
                                >
                                <MenuItem Header="Test Item" />
                                <MenuItem Header="Test Item" />
                                <MenuItem Header="Test Item" />
                                <MenuItem Header="Test Item" />
                            </ContextMenu>
                        </Setter.Value>
                    </Setter>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </DataGrid.Style>
</DataGrid>

【讨论】:

以上是关于绑定到 UserControl XAML 中的依赖属性的主要内容,如果未能解决你的问题,请参考以下文章

UserControl:如何转换依赖属性并绑定到结果

WPF ----在UserControl的xaml里绑定依赖属性

如何绑定到WPF中的usercontrol内的控件?

TreeView ItemSsource 绑定到 ViewModel 不更新 xaml 控件项

使用该控件时的 MVVM UserControl 和绑定

数据绑定到 WPF 中的 UserControl