2017-07-13 118 views
0

我想重用控件,但其中一个方案需要上下文菜单,而其他方案则不需要。这是我的尝试。绑定到UserControl中的依赖项属性XAML

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

现在我不能离开广场的一部分,我怎么访问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'

+1

你说得对,我觉得我打了普通话propdp的d。我的第一个实现。 RelativeSource,然后通过祖先链? – markokstate

+0

'' –

+1

无法找到,我的尝试更新了这个问题 – markokstate

回答

2

A disabled ContextMenu打开,但其项目被禁用。那么很难让它结束。如果这就是你想要的,我怀疑,binding proxy会让你在那里(见下面的完整版本)。

如果你想要的是刚刚摆脱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> 

这里的绑定代理版本:

public class BindingProxy : Freezable 
{ 
    #region Overrides of Freezable 

    protected override Freezable CreateInstanceCore() 
    { 
     return new BindingProxy(); 
    } 

    #endregion 

    public object Data 
    { 
     get { return (object)GetValue(DataProperty); } 
     set { SetValue(DataProperty, value); } 
    } 

    // Using a DependencyProperty as the backing store for Data. This enables animation, styling, binding, etc... 
    public static readonly DependencyProperty DataProperty = 
     DependencyProperty.Register("Data", typeof(object), typeof(BindingProxy), new UIPropertyMetadata(null)); 
} 

XAML:

<DataGrid 
    > 
    <DataGrid.Resources> 
     <local:BindingProxy 
      x:Key="UserControlBindingProxy" 
      Data="{Binding RelativeSource={RelativeSource AncestorType=UserControl}}" 
      /> 
    </DataGrid.Resources> 
    <DataGrid.ContextMenu> 
     <ContextMenu 
      IsEnabled="{Binding Data.UseContextMenu, Source={StaticResource UserControlBindingProxy}}" 
      > 
      <MenuItem Header="Test Item" /> 
      <MenuItem Header="Test Item" /> 
      <MenuItem Header="Test Item" /> 
      <MenuItem Header="Test Item" /> 
     </ContextMenu> 
    </DataGrid.ContextMenu> 
</DataGrid> 
+0

Yessir,触发魔法!非常感谢你。 – markokstate