2015-05-12 5 views
0

Я пишу папку браузера, и я хочу открыть папки с двойным щелчком. Мои папки переплетены в ListView с GridView внутри и я отслеживание двойного щелчка, как это:Отслеживать, где я нажал в ListView MVVM

<i:EventTrigger EventName="MouseDoubleClick"> 
        <Custom:EventToCommand Command="{Binding FolderOpenedCommand, Mode=OneWay}" CommandParameter="{Binding SelectedItem, ElementName=FolderView}"/> 
       </i:EventTrigger> 

Но у меня раздражает вопрос: если я дважды щелкните на GridView сплиттера в Autosize колонны, он будет также открыть выбранную папку , чего я не хочу. Итак, у меня есть несколько вариантов: поместите обработчик событий внутри стиля и используйте его с кодом позади или оставьте его как есть, но в моем случае я хочу реализовать его с помощью сценария MVVM, потому что codebehind не подходит для меня.

Мой вопрос: как я могу отправить свой параметр как SelectedItem, только если я нажму на элемент и null, когда я нажму на другое?

Я хочу отслеживать это, чтобы сделать правильное поведение, поскольку по какой-то причине я не могу применить двойной щелчок к gridview.

Не могли бы вы помочь мне с этой проблемой?

EDIT: Позволяет уточнить одну вещь, чтобы убедиться, что мы говорим о том же: я могу определить что-то вроде этого

<Style x:Key="itemStyle" TargetType="{x:Type ListViewItem}" BasedOn="{StaticResource MetroListViewItem}"> 
    <EventSetter Event="MouseDoubleClick" Handler="FolderView_OnMouseDoubleClick"></EventSetter> 
    </Style> 

Bu Я не могу сделать так:

<Style x:Key="itemStyle" TargetType="{x:Type ListViewItem}" BasedOn="{StaticResource MetroListViewItem}"> 
    <EventSetter Event="MouseDoubleClick" Handler="{Binding OpenFilesCommand}"></EventSetter> 
    </Style> 

Поскольку Это приведет к исключению. Теперь я хочу понять, как я могу применить команду здесь, если Handler не принимает команду? Нужно ли писать некоторые прикрепленные свойства?

+0

Ваш выбор использования «ListView» с помощью «GridView» необычен для вашего требования ... браузер папок чаще всего реализуется с помощью элемента управления TreeView. – Sheridan

+0

Windows Explorer использует treview со списком для подробного просмотра. Я делаю то же самое – Denis

+0

Ahh извините, я думал, вы говорите о левой колонке. – Sheridan

ответ

1

Избегайте использование ListView. Вместо этого используйте DataGrid. Затем вы можете добавить eventtrigger в стиль строки. ListView - это устаревший класс, введенный в wpf 3, который был заменен datagrid в wpf 4, и нет никаких оснований для его использования.

Другим вариантом является использование пользовательского поведения использования, реализованного как прикрепленное свойство, например. InvokeCommandOnRowDoubleClick подключен к сетке. Чтобы узнать больше о приложенном поведении, прочитайте следующее: http://blogs.msdn.com/b/dgartner/archive/2009/11/11/wpf-attached-behavior-example-watermark-text.aspx

0

На контроле ListViewItem находится MouseDoubleClick. Вы можете переделать свой стиль, чтобы содержать правильное событие при двойном щелчке по элементу, применить его только к ListViewItems, и он не будет слушать это событие, если не дважды щелкнуть разделитель gridview.

Вы можете узнать больше об этом here.

+0

Я знаю об этой возможности, но, как я вижу, в сценарии MVVM нет возможности сделать это. Я прав? – Denis

+0

Если вы привязываете свое представление с помощью своей модели просмотра, нет причин, по которым он не должен работать.Вы должны иметь возможность использовать команду на своей виртуальной машине. –

+0

'' его не MVVM и нет никакого способа, чтобы заменить Handler с моей командой, насколько я знаю – Denis

0

Ну, для решения этой проблемы мне пришлось использовать свойство InputBindings для каждого элемента управления в каждом столбце gridview. Я поставил сетку на элементы управления и сделал так:

<GridViewColumn Header="Size (Bytes)"> 
       <GridViewColumn.CellTemplate> 
       <DataTemplate> 
        <Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch"> 
         <Grid.InputBindings> 
          <MouseBinding Gesture="LeftDoubleClick" Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}, Path=DataContext.FolderOpenedCommand}" 
            CommandParameter="{Binding ElementName=FolderView, Path=SelectedItem}"></MouseBinding> 
         </Grid.InputBindings> 
         <TextBlock Text="{Binding Path=Size, StringFormat='{}{0:#,#.}'}"/> 
        </Grid> 
       </DataTemplate> 
       </GridViewColumn.CellTemplate> 
      </GridViewColumn> 

К сожалению, для моего случая я не нашел лучшее решение

Смежные вопросы