TreeViewItem.Expanded - PullRequest
       20

TreeViewItem.Expanded

2 голосов
/ 15 июля 2010

Я использую последнюю версию легкого инструментария mvvm, однако я не совсем понимаю, как я могу использовать EventToCommand для события TreeViewItem.Expanded.

Это работает ... что я делаю неправильно?1003 *

<TreeView Grid.Column="0" Grid.Row="0" ItemsSource="{Binding Path= MonitoredDatabases}">
        <TreeView.ItemTemplate>
            <HierarchicalDataTemplate ItemsSource="{Binding Queues}">

                <StackPanel Orientation="Horizontal">
                    <TextBlock Text="{Binding ServerName}" />
                    <TextBlock Text="\" />
                    <TextBlock Text="{Binding DatabaseName}" />
                </StackPanel>

                <HierarchicalDataTemplate.ItemTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding QueueName}" />
                    </DataTemplate>
                </HierarchicalDataTemplate.ItemTemplate>

            </HierarchicalDataTemplate>
        </TreeView.ItemTemplate>
        <i:Interaction.Triggers>
            <i:EventTrigger EventName="TreeViewItem.Expanded">
                <cmd:EventToCommand Command="{Binding Path=NodeExpanded}"
                                    CommandParameter="Expanded" />
            </i:EventTrigger>
            <i:EventTrigger EventName="TreeViewItem.Collapsed">
                <cmd:EventToCommand Command="{Binding Path=NodeCollapsed}"
                                    CommandParameter="Collapsed" />
            </i:EventTrigger>
        </i:Interaction.Triggers>
    </TreeView>

очень признателен за помощь.

С уважением.

Гари

Ответы [ 2 ]

1 голос
/ 20 октября 2010

Мне удалось сделать это путем создания пользовательского ItemContainerStyle для TreeView . Вы должны быть в состоянии соединить это со следующими фрагментами кода.

1. Модель представления для TreeView

public class TreeViewModelView
{
    public IEnumerable<object> Values
    {
        get { /* return hierarchical data source here ... */ }
    }

    /// <summary>
    /// Command executed when the TreeViewItem expanding event is raised. The data item is passed in as a parameter.
    /// </summary>
    public RelayCommand<object> ExpandedCommand
    {
        get { return new RelayCommand<object>( o => MessageBox.Show( o.GetType().Name ) ); }
    }

    /// <summary>
    /// Command executed when the TreeViewItem collapsing event is raised.
    /// </summary>
    public RelayCommand CollapsedCommand
    {
        get { return new RelayCommand( () => MessageBox.Show( "Collapsed" ) ); }
    }

}

2. Определите TreeView и настройте необходимую привязку данных:

 <TreeView x:Name="lstItems" HorizontalAlignment="Left" Margin="21,19,0,80" Width="283" 
          DataContext="{DynamicResource TreeViewModelView}"
          ItemsSource="{Binding Values, Mode=OneWay}" 
          ItemTemplate="{DynamicResource TreeViewDataTemplate}" 
          ItemContainerStyle="{DynamicResource TreeViewItemStyle}">
    <TreeView.Resources>
        <mv:TreeViewModelView x:Key="TreeViewModelView" />

        <HierarchicalDataTemplate x:Key="TreeViewDataTemplate" ItemsSource="{Binding Items}">
            <Grid>
                <TextBlock Text="{Binding Name}" />
            </Grid>
        </HierarchicalDataTemplate>
    </TreeView.Resources>
</TreeView>

3. В Expression Blend вы можете создать редактировать копию ItemContainerStyle template

<Style x:Key="TreeViewItemStyle" TargetType="{x:Type TreeViewItem}">

    ...

</Style>

4. Затем замените ToggleButton на:

<ToggleButton x:Name="Expander" ClickMode="Press" IsChecked="{Binding IsExpanded, RelativeSource={RelativeSource TemplatedParent}}" Style="{StaticResource ExpandCollapseToggleStyle}">

    <i:Interaction.Triggers>
        <!-- When the Checked event is raised execute the ExpandedCommand with the data item as a parameter. -->
        <i:EventTrigger EventName="Checked">
            <GalaSoft_MvvmLight_Command:EventToCommand Command="{Binding Path=DataContext.ExpandedCommand, RelativeSource={RelativeSource AncestorType={x:Type TreeView}}, Mode=OneWay}" 
                CommandParameter="{Binding}" />
        </i:EventTrigger>
        <!-- When the Unchecked event is raised execute the CollapsedCommand. -->
        <i:EventTrigger EventName="Unchecked">
            <GalaSoft_MvvmLight_Command:EventToCommand Command="{Binding Path=DataContext.CollapsedCommand, RelativeSource={RelativeSource AncestorType={x:Type TreeView}}, Mode=OneWay}"/>
        </i:EventTrigger>
    </i:Interaction.Triggers>

</ToggleButton>
0 голосов
/ 15 июля 2010

Поведение события к команде реализовано как присоединенное свойство, которое должно быть присоединено к FrameworkElement.В вашем образце свойство присоединенных триггеров прикреплено к TreeView, для которого нет события Expanded или Collapsed.Вы попытались использовать «TreeViewItem.Expanded» в качестве имени события, но это не сработало.

Если вы создавали свои TreeViewItems статически в XAML или вручную в коде позади, вы могли бы присоединиться ккаждый TreeViewItem.К сожалению, я не знаю ни одного способа присоединения к TreeViewItem из HierarchicalDataTemplate.Вы можете привязаться к TemplatedParent RelativeSource, но не можете присоединиться к нему.Ваше единственное решение - перебирать TreeViewItems в выделенном коде и обрабатывать события вручную, но даже в этом случае вам придется делать это, используя VisualTreeHelper, только после того, как элемент управления TreeView будет привязан и обработан для данных, что является огромным хаком.

...