2017-07-13 6 views
0

Ich möchte ein Steuerelement wiederverwenden, aber eines der Szenarien erfordert ein Kontextmenü und die anderen nicht. Hier ist mein Versuch.Bindung an eine Abhängigkeitseigenschaft in 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(); 
     } 
    } 

Und in der XAML die Eigenschaft zu verwenden:

<ctls:RP8Grid UseContextMenu="False"/> 

Jetzt ist der Teil ich nicht weg quadrieren kann, wie gelange ich UseContextMenu innerhalb des Usercontrol? Ich habe folgendes versucht:

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

mit den Ergebnissen:

kann nicht Quelle finden mit Referenzbindung 'Relative FindAncestor, AncestorType =' System.Windows.Controls.UserControl‘, AncestorLevel = '1'

+1

Sie haben Recht, ich denke, ich traf propa instea d von propdp. Meine erste Implementierung. RelativeSource, dann durch die Ahnenkette hinauf? – markokstate

+0

' ' –

+1

Konnte nicht finden, habe die Frage mit meinem Versuch aktualisiert – markokstate

Antwort

2

Ein deaktiviertes ContextMenu wird geöffnet, aber mit deaktivierten Elementen. Dann ist es schwer, es zu schließen. Wenn Sie das wollen, was ich bezweifle, wird Sie ein binding proxy dorthin bringen (siehe die vollständige Version dieses Ansatzes unten).

Wenn das, was Sie wollen, ist nur der ContextMenu manchmal loszuwerden, wird diese Arbeit:

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

Hier ist die Bindung Proxy-Version:

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, löst Magie aus! Vielen Dank. – markokstate

Verwandte Themen