【问题标题】:Attach command to tree view children - different for nested children将命令附加到树视图子级 - 嵌套子级不同
【发布时间】:2013-05-31 12:58:11
【问题描述】:

我正在使用此处的代码:WPF/MVVM - how to handle double-click on TreeViewItems in the ViewModel?,来自已接受的答案。我的xml是这样的:

<TreeView CommandBehaviors:MouseDoubleClick.Command="{Binding ConnectServer}" CommandBehaviors:MouseDoubleClick.CommandParameter="{Binding Path=SelectedItem, RelativeSource={RelativeSource Self}}" 
                                  Grid.Column="0" HorizontalAlignment="Stretch" DockPanel.Dock="Left" ItemsSource="{Binding Path=ServerItems, UpdateSourceTrigger=PropertyChanged}">
    <TreeView.ItemContainerStyle>
        <Style TargetType="{x:Type TreeViewItem}">
            <Setter Property="CommandBehaviors:MouseDoubleClick.Command" Value="{Binding ConnectDb}"/>
            <Setter Property="CommandBehaviors:MouseDoubleClick.CommandParameter" Value="{Binding Path=SelectedItem, RelativeSource={RelativeSource Self}}"/>
        </Style>
    </TreeView.ItemContainerStyle>
    <TreeView.ItemTemplate>
        <HierarchicalDataTemplate ItemsSource="{Binding Databases}">
            <TextBlock Text="{Binding}" />
        </HierarchicalDataTemplate>
    </TreeView.ItemTemplate>
</TreeView>

样式标签中的附加命令不起作用,它不应该,因为在 TreeView 标签级别上已经附加了一个命令。我要做的是为顶级孩子执行一个命令,为低级孩子执行另一个命令。我该怎么做?

编辑:

那么,正如 Viv 所建议的 - 我如何检查 treeviewitem 是否是根节点?

【问题讨论】:

  • TreeView 中删除附加属性并添加一个Style.Trigger,以检查当前TreeViewItem 是否为根,并相应地将附加属性应用于您当前在TreeView 中拥有的属性
  • 我实际上不知道该怎么做,你能给我一些示例代码吗?您可以发布答案,如果有效,我会接受。
  • 我的意思是 - 像这样检查它:&lt;Trigger Property="IsRootNode"&gt; 不起作用 = 没有 IsRootNode 属性,所以我应该自己写这个吗?

标签: c# wpf mvvm attachedbehaviors


【解决方案1】:

类似:

<Window.Resources>
  <CommandBehaviors:IsRootNodeConverter x:Key="IsRootNodeConverter" />
</Window.Resources>
<Grid>
  <TreeView>
    <TreeView.ItemContainerStyle>
      <Style TargetType="{x:Type TreeViewItem}">
        <Setter Property="CommandBehaviors:MouseDoubleClick.Command"
                Value="{Binding ConnectDb}" />
        <Setter Property="CommandBehaviors:MouseDoubleClick.CommandParameter"
                Value="{Binding Path=SelectedItem,
                                RelativeSource={RelativeSource Self}}" />
        <Setter Property="Foreground"
                Value="Black" />
        <Style.Triggers>
          <DataTrigger Binding="{Binding Path=.,
                                          RelativeSource={RelativeSource Self},
                                          Converter={StaticResource IsRootNodeConverter}}"
                        Value="True">
            <Setter Property="CommandBehaviors:MouseDoubleClick.Command"
                    Value="{Binding ConnectServer}" />
            <Setter Property="Foreground"
                    Value="Tomato" />
          </DataTrigger>
        </Style.Triggers>
      </Style>
    </TreeView.ItemContainerStyle>
    <TreeView.ItemTemplate>
      <HierarchicalDataTemplate>
        <!--<TreeViewItem>-->
          <TextBlock Text="{Binding}" />
        <!--</TreeViewItem>-->
      </HierarchicalDataTemplate>
    </TreeView.ItemTemplate>
    <TreeViewItem Header="1">
      <TreeViewItem Header="A" />
      <TreeViewItem Header="B">
        <TreeViewItem Header="AA" />
        <TreeViewItem Header="AB" />
        <TreeViewItem Header="AC" />
      </TreeViewItem>
      <TreeViewItem Header="C" />
    </TreeViewItem>
  </TreeView>
</Grid>

和转换器:

class IsRootNodeConverter : IValueConverter
{
  public object Convert(object value, Type targetType, object parameter, CultureInfo culture) {
    TreeViewItem item = value as TreeViewItem;
    if (item == null || item.Parent == null)
      return false;
    return !Object.ReferenceEquals(value.GetType(), item.Parent.GetType());
  }

  public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) {
    throw new NotImplementedException();
  }
}

我故意从Style Trigger 中省略了CommandBehaviors:MouseDoubleClick.CommandParameter,因为它似乎与默认值没有变化。刚刚添加了一个Foreground 属性进行测试,你也可以删除它。

【讨论】:

猜你喜欢
  • 2016-12-31
  • 2018-04-27
  • 2015-07-27
  • 1970-01-01
  • 2021-06-23
  • 1970-01-01
  • 2011-10-15
  • 2015-08-31
  • 2012-01-01
相关资源
最近更新 更多