2017-01-26 19 views
3

У меня есть ViewModel, который наследует от Conductor<T>.Collection.OneActive. В представлении I я связывал DataGrid с объектом Items и с номером ContentControl до ActiveItem.Caliburn.Micro отключить событие кликов по умолчанию для ItemsControl

<ContentControl x:Name="ActiveItem" DockPanel.Dock="Top"/> 
    <DataGrid x:Name="Items" AutoGenerateColumns="False" SelectionMode="Single" DockPanel.Dock="Top" 
       cal:Message.Attach="[Event MouseDoubleClick] = [Action test]"> 
     <DataGrid.Columns> 
      <DataGridTextColumn Binding="{Binding CountryCode}" Width="10*"/> 
      <DataGridTextColumn Binding="{Binding Country}" Width="90*" /> 
     </DataGrid.Columns> 
    </DataGrid> 
</ContentControl> 

Это работает отлично, за исключением одной вещи: я хочу, чтобы активировать DetailsViewModel, когда один из ряда Сетка была двойной клик. Мой метод void test() получает вызов, но я не могу отключить метод Click.

Любое предложение?

EDIT

Может быть, я не был достаточно ясен. Моя проблема - поведение по умолчанию Conductor<T>. Он не должен активировать экран сведений для одного левого клика, но для двойного.

EDIT 2

По Nkosi «s помощь, наконец, выяснили некоторые обходной путь: Просто изменила ContentControl связывание с ActiveItem к ActiveScreen.

<ContentControl x:Name="ActiveScreen" DockPanel.Dock="Top"/> 

В ViewModel создал ActiveScreen свойство:

private T mActiveScreen; 
public T ActiveScreen 
{ 
    get { return mActiveScreen; } 
    set 
    { 
     mActiveScreen = value; 
     NotifyOfPropertyChange(() => ActiveScreen); 
    } 
} 

В связанном методе MouseDoubleClick вы просто должны установить ActiveScreen в ActiveItem.

public void test() 
    { 
     ActiveScreen = ActiveItem; 
    } 
+0

Он активируется, потому что, как только вы выбираете элемент, он становится активным элементом, который активирует его. Даже если вы нажмете на один элемент и затем используйте клавиши со стрелками вверх и вниз, он активирует каждый выбранный элемент. – Nkosi

+0

Я вижу, но как я могу отключить это поведение? – Smoke

+0

Возможно, он активирует элементы при изменении выбора? – Smoke

ответ

2

Caliburn имеет функцию действия охранника, где Can{MethodName} выступает в качестве охранника для действия, которое будет вызываться. Это может быть либо свойство, либо другой метод, как только он следует за конвенцией.

Так дали

public void test() { ... } 

его охранник будет выглядеть

public bool Cantest { 
    get { return //..what ever is the condition needed to allow/disable action 
} 

или

public bool Cantest() { 
    return //..what ever is the condition needed to allow/disable action 
} 

Caliburn documentation - All About Actions

Еще одна важная особенность, которую следует отметить - защитные меры.Когда обработчик , найденный для сообщения «SayHello», он проверит, имеет ли этот класс либо свойство, либо метод с именем «CanSayHello». Если у вас есть свойство защиты, а ваш класс реализует INotifyPropertyChanged, тогда структура будет наблюдать изменения в , что свойство и переоценить охрану соответственно.

+0

Я обновил свой вопрос, потому что у нас было некоторое недоразумение, я думаю. – Smoke

0


В концепции Caliburn.Micro EventAggregator является Тир. Прочитайте эту концепцию, которая поможет вам

Опубликуйте сообщение в текущей модели и подпишитесь в DetailsViewModel.
Его работы.

https://caliburnmicro.codeplex.com/wikipage?title=The%20Event%20Aggregator
и
Caliburn.Micro EventAggregator

+0

Я думаю, что понимаю, как работает EventAggregator, но не может понять, как это мне поможет в этой конкретной ситуации. Не могли бы вы объяснить более подробно? Я также обновил свой вопрос. – Smoke

+0

Да, вы применили событие для сетки данных, где когда-либо вы щелкнули внутри datagrid, вызванное этим событием, это прекрасно. Теперь u должен создать кнопку (Закрыть), а внутри кнопки - опубликовать msg в Home Viewmodel, а в домашней модели просмотра активен главный экран. –

+0

Если его не работает, отправьте подробный вопрос на мою почту. [email protected] –