2017-07-13 19 views
0

コントロールを再利用したいが、シナリオの1つにコンテキストメニューが必要で、それ以外のものは必要ありません。ここに私の試みです。UserControl内のDependencyプロパティへのバインドXAML

<ctls:RP8Grid UseContextMenu="False"/> 

今の部分は、私は、ユーザーコントロール内のUseContextMenuにアクセスしないか、離れて正方形ではないことができます。プロパティを使用する

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で?結果と

<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

あなたは正しいです、私はpropa insteaをヒットしたと思いますdのpropdp。私の最初の実装。 RelativeSource、そして祖先のチェーンを通って? – markokstate

+0

' ' –

+1

私の試行で質問を更新できませんでした – markokstate

答えて

2

A無効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

関連する問題