TreeViewItem按钮命令绑定

时间:2010-10-28 16:17:46

标签: wpf treeview binding

美好的一天,

这里的第一个问题,只是学习WPF,所以请温柔......

我正在尝试组合一个TreeView,其项目可以触发命令。我确信有很多方法可以实现这一点,但我的方法是使用ControlTemplate为TreeViewItem创建一个Style,其中包含一个RadioButton用于其Command功能。

. . .
<ToggleButton x:Name="Expander"
  Style="{StaticResource ExpandCollapseToggleStyle}" Grid.Column="0" Grid.Row="0" 
  IsChecked="{Binding Path=IsExpanded, RelativeSource={RelativeSource TemplatedParent}}"
  ClickMode="Press"/>
  <RadioButton Style="{StaticResource TreeElementStyle}"
    Grid.Row="0" Grid.Column="1" Command="{TemplateBinding ???}">
    <ContentPresenter x:Name="PART_Header" ContentSource="Header"/>
  </RadioButton>
  <ItemsPresenter x:Name="ItemsHost" Grid.Row="1" Grid.Column="1" Grid.ColumnSpan="2"/>
</Grid>
. . .

无论如何,我的树在视觉上看起来很好但是无法理解如何将我的Command绑定到合并的RadioButton,并且迷失在模板混乱的泥潭中。

. . .
<TreeView>
  <TreeViewItem Header="Enterprise">
    <TreeViewItem Header="General Settings"
      Command="{Binding Path=GeneralSettingsCommand}"/>
. . .

我会提供更多的代码,但我认为在这一点上,答案将更加符合“Dude,你的方式偏离轨道。首先阅读blah”或“一个按钮完全没必要”,或者“你应该使用ItemTemplate”或“......”或“只是放弃”;)

1 个答案:

答案 0 :(得分:0)

谢谢Meleak;很好的信息。

但是,我找到了一个非常简单的解决方案 - 无论如何都是出于我的目的。

整个技巧是将Button作为TreeViewItem.Header提供,而不是将其合并到TreeViewItem的ControlTemplate中。

如果我将Button作为TreeViewItem.Header提供,我可以轻松地在其上设置命令并对其进行适当的样式设置。

以下是示例:

<Page
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  <Page.Resources>
    <Style TargetType="{x:Type RadioButton}">
      <Setter Property="GroupName" Value="TreeGroup"/>
      <Setter Property="Focusable" Value="False"/>
      <Setter Property="Template">
        <Setter.Value>
          <ControlTemplate TargetType="{x:Type RadioButton}">
            <Grid >
              <Grid.ColumnDefinitions>
                <ColumnDefinition/>
                <ColumnDefinition/>
              </Grid.ColumnDefinitions>
              <!-- beginnings of a folder icon -->
              <Border Background="Black" VerticalAlignment="Center" Width="12" Height="10" CornerRadius="2">
                <Border Background="DarkGoldenrod" Margin="1"/>
              </Border>
              <Border Grid.Column="1" Margin="4,0,0,0" Padding="1,2,4,2" Name="Selection" Background="Transparent">
                <ContentPresenter />
              </Border>
            </Grid>
            <ControlTemplate.Triggers>
              <Trigger Property="IsChecked" Value="True">
                <Setter TargetName="Selection" Property="Background" Value="DarkBlue"/>
                <Setter Property="Foreground" Value="White"/>
              </Trigger>
            </ControlTemplate.Triggers>
          </ControlTemplate>
        </Setter.Value>
      </Setter>
    </Style>
  </Page.Resources>
  <Grid>  
     <TreeView Width="220" Focusable="False">
      <TreeViewItem IsExpanded="True">
        <TreeViewItem.Header>
          <RadioButton Content="Enterprise"/>
        </TreeViewItem.Header>
        <TreeViewItem>
          <TreeViewItem.Header>
            <RadioButton Content="Settings" Command="{Binding SettingsCommand}"/>
          </TreeViewItem.Header>
        </TreeViewItem>
        <TreeViewItem>
          <TreeViewItem.Header>
            <RadioButton Content="Statistics" Command="{Binding StatisticsCommand}"/>
          </TreeViewItem.Header>
        </TreeViewItem>
      </TreeViewItem>
    </TreeView>
  </Grid>
</Page>