WPF: проблемы с командой при размещении ListView внутри аккордеона с использованием MVVM Light

У меня есть это представление:

<Grid Margin="10,0,10,10">
<StackPanel>
    <wpftoolkit:Accordion 
    Margin="4" 
    HorizontalAlignment="Stretch" 
    Name="accordionCB"
    ItemsSource="{Binding Path=ContentBlockCategories}"
    SelectionMode="ZeroOrMore">
        <wpftoolkit:Accordion.ItemTemplate>
            <DataTemplate>
                <Grid HorizontalAlignment="Stretch" Margin="0 0 0 4">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="*" />
                        <ColumnDefinition Width="*" />
                    </Grid.ColumnDefinitions>
                    <TextBlock 
                            Text="{Binding Description}"
                            Grid.Column="0" VerticalAlignment="Center" />
                </Grid>
            </DataTemplate>
        </wpftoolkit:Accordion.ItemTemplate>
        <wpftoolkit:Accordion.ContentTemplate>
            <DataTemplate>

                <!--Not Raise MouseDoubleClick Command-->

                <ListView 
                x:Name="lvContentBlocks"
                AlternationCount="2" 
                ItemsSource="{Binding ContentBlocks}"
                IsSynchronizedWithCurrentItem="True"
                HorizontalAlignment="Stretch"
                VerticalAlignment="Stretch">
                    <i:Interaction.Triggers>
                        <i:EventTrigger EventName="MouseDoubleClick">
                            <cmd:EventToCommand PassEventArgsToCommand="True" Command="{Binding Path=MouseDoubleClick}" />
                        </i:EventTrigger>
                    </i:Interaction.Triggers>
                    <ListView.ItemTemplate>
                        <DataTemplate>
                            <Grid Margin="0,0,0,5">
                                <StackPanel VerticalAlignment="Top">
                                    <TextBlock Text="{Binding Description}" TextWrapping="Wrap" />
                                </StackPanel>
                            </Grid>
                        </DataTemplate>
                    </ListView.ItemTemplate>
                </ListView>
            </DataTemplate>
        </wpftoolkit:Accordion.ContentTemplate>
    </wpftoolkit:Accordion>

    <!--Raise MouseDoubleClick Command-->

    <ListView 
                x:Name="lvContentBlocks"
                AlternationCount="2" 
                ItemsSource="{Binding ContentBlockCategories}"
                IsSynchronizedWithCurrentItem="True"
                HorizontalAlignment="Stretch"
                VerticalAlignment="Stretch">
        <i:Interaction.Triggers>
            <i:EventTrigger EventName="MouseDoubleClick">
                <cmd:EventToCommand Command="{Binding MouseDoubleClick}" PassEventArgsToCommand="True" />
            </i:EventTrigger>
        </i:Interaction.Triggers>
        <ListView.ItemTemplate>
            <DataTemplate>
                <Grid Margin="0,0,0,5">
                    <StackPanel VerticalAlignment="Top">
                        <TextBlock Text="{Binding Description}" TextWrapping="Wrap" />
                    </StackPanel>
                </Grid>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
</StackPanel>
</Grid>

И эта ViewModel:

public class MainViewModel : ViewModelBase
    {
        public ObservableCollection<ContentBlockCategory> ContentBlockCategories
        {
            get
            {
                return new ObservableCollection<ContentBlockCategory>
                    {
                        new ContentBlockCategory{
                            Id = 1,
                            Description = "Category 1",
                            ContentBlocks = new Collection<ContentBlock>
                            {
                                new ContentBlock{
                                    Id = 1,
                                    Description = "Content Block 1",
                                    Text = "Text"
                                }
                            }
                        }
                    };
            }
            set
            {
                RaisePropertyChanged("ContentBlockCategories");
            }
        }

        public RelayCommand<MouseButtonEventArgs> MouseDoubleClick
        {
            get;
            private set;
        }

        public MainViewModel()
        {
            MouseDoubleClick = new RelayCommand<MouseButtonEventArgs>(e =>
            {
                DependencyObject dep = (DependencyObject)e.OriginalSource;

                while ((dep != null) && !(dep is ListViewItem))
                {
                    dep = VisualTreeHelper.GetParent(dep);
                }

                if (dep == null) return;

                ContentBlockCategory contentBlockSelected = (ContentBlockCategory)((ListViewItem)dep).DataContext;
            });
        }
    }

Первый ListView внутри Accordion не вызывает RelayCommand в ViewModel, но второй ListView вызывает RelayCommand без каких-либо проблем.

В чем проблема?

С Уважением


person Luis Ruiz Pavón    schedule 31.08.2010    source источник


Ответы (1)


У меня были проблемы с EventToCommand в шаблонах и стилях, пример проблемы можно найти здесь

В таких ситуациях я перешел на AttachedCommandBehaviors (ACB). . Ссылка ведет к C# Diciples о том, как использовать ACB.

Фрагмент кода его использования из моей базы кода:

            <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type ListViewItem}">
                    <StackPanel x:Name="IconBorder"
                               acb:CommandBehavior.Event="PreviewMouseUp"
                               acb:CommandBehavior.Command="{Binding Path=DataContext.ClickCommand, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type UserControl}}}"
                               acb:CommandBehavior.CommandParameter="{Binding}">
person Erick    schedule 13.04.2012