Бутон TreeViewItem Командно обвързване

Добър ден,

Първият въпрос тук и просто научавам WPF, така че, моля, бъдете нежни...

Опитвам се да събера TreeView, чиито елементи задействат команди. Сигурен съм, че има много начини да се постигне това, но моят подход беше да създам стил за TreeViewItem с ControlTemplate, който включва RadioButton за своята командна функционалност.

. . .
<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)


Благодаря ти Meleak; добра информация.

Намерих обаче много просто решение - така или иначе за моите цели.

Целият трик е да предоставите бутона като 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