命令参数传递父引用

时间:2012-06-07 07:57:19

标签: c# wpf multibinding imultivalueconverter commandparameter

我有一个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();
    }
}

3 个答案:

答案 0 :(得分:0)

如果我理解正确,你可能会颠倒整个事情:

在您的datacontext中发布您的命令并提供实例 您的subdatacontext作为命令参数(这只是绑定 你的物品)

答案 1 :(得分:0)

您在绑定中使用PlacementTaregt但未在任何地方设置ContextMenu.PlacementTarget ...

  <TextBlock Text="{Binding"} x:Name="MyTextBox">
    <TextBlock.ContextMenu>
      <ContextMenu PlacementTarget="{Binding ElementName=MyTextBox}"> 
        .....

答案 2 :(得分:0)

直接的方法是拥有您的会员集合所持有的视图模型。

并且使用子视图模型,不需要进入绑定,因为您可以只保存viewmodel类中所需的数据。它是您的模型(字符串来自)和您的视图(显示字符串的位置)之间的适配器。