Привязка команды кнопки TreeViewItem

Добрый день,

Первый вопрос здесь и только изучение WPF, поэтому, пожалуйста, будьте осторожны...

Я пытаюсь собрать TreeView, элементы которого запускают команды. Я уверен, что есть много способов сделать это, но мой подход состоял в том, чтобы создать Style для TreeViewItem с ControlTemplate, который включает 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>
. . .

Несмотря на это, у меня дерево визуально выглядит нормально, но я не могу понять, как связать мою команду с интегрированным RadioButton, и я теряюсь в трясине путаницы с шаблонами.

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

Я бы предоставил больше кода, но я предполагаю, что на данный момент ответы будут примерно такими: «Чувак, ты далеко не в курсе. вместо этого следует использовать ItemTemplate" или..." или "просто сдайтесь уже";)


person zullo    schedule 28.10.2010    source источник
comment
{TemplateBinding TreeViewItem.Command} не работает?   -  person decyclone    schedule 17.12.2010


Ответы (1)


Спасибо Мелеак; хорошая информация.

Однако я нашел очень простое решение - во всяком случае, для моих целей.

Весь трюк заключается в том, чтобы предоставить кнопку как TreeViewItem.Header, а не включать ее в ControlTemplate TreeViewItem.

Если я предоставлю кнопку как 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>
person zullo    schedule 28.10.2010