0

WPFツリービューがあり、子ノードコンテキストで親ノードの参照が必要です。メニューコマンド。以下のXAMLでは、メンバーコマンドパラメーターでAの参照を渡す必要があります

XAML:

<DataTemplate x:Key="Member">
 <TextBlock Text="{Binding}" Tag="{Binding DataContext, RelativeSource={RelativeSource AncestorType=mylib:ExtendedTreeView}}">
  <TextBlock.ContextMenu>
   <ContextMenu>
    <MenuItem Header="Delete" Command="{Binding RelativeSource={RelativeSource AncestorType=ContextMenu}, Path=PlacementTarget.Tag.DeleteMmeberCommand}">
     <MenuItem.CommandParameter>
      <MultiBinding Converter="{StaticResource MutilValueConverter}">
       <Binding Path=".."/>
        <Binding />
      </MultiBinding>
     </MenuItem.CommandParameter>
    </MenuItem>
   </ContextMenu>
  </TextBlock.ContextMenu>
 </TextBlock>
</DataTemplate>
<HierarchicalDataTemplate DataType="{x:Type A}" ItemsSource="{Binding Members}" ItemTemplate="{StaticResource Member}"
 <TextBlock Text="{Binding"}>
  <TextBlock.ContextMenu>
   <ContextMenu>
    <MenuItem Header="Delete" Command="{Binding RelativeSource={RelativeSource AncestorType=ContextMenu}, Path=PlacementTarget.Tag.DeleteACommand}" CommandParameter="{Binding}"/>
   </ContextMenu>
  </TextBlock.ContextMenu>
 </TextBlock>
</HierarchicalDataTemplate>


<TreeView ItemsSource="{Binding As}"/>

コンバータ:

public class MutilValueConverter : IMultiValueConverter
{
    public object  Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        return values;
    }

    public object[]  ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
4

3 に答える 3

0

直接的な方法は、Members コレクションが保持しているもののビューモデルを用意することです。

子ビューモデルを使用すると、ビューモデル クラスで必要なデータを保持するだけでよいため、バインディングを取得する必要はありません。これは、モデル (文字列の取得元) とビュー (文字列が表示される場所) の間のアダプターです。

于 2012-06-07T18:08:50.707 に答える
0

PlacementTaregtバインディングで使用していますが、ContextMenu.PlacementTargetどこにも設定していません...

  <TextBlock Text="{Binding"} x:Name="MyTextBox">
    <TextBlock.ContextMenu>
      <ContextMenu PlacementTarget="{Binding ElementName=MyTextBox}"> 
        .....
于 2012-06-07T08:26:53.640 に答える
0

私が正しく理解していれば、すべてを逆にすることができます:

コマンドをデータコンテキストで公開し、サブデータコンテキストのインスタンスをコマンドパラメーターとして提供します(これはアイテムのバインディングにすぎません)

于 2012-06-07T08:10:00.923 に答える