2013-07-16 12 views
1

TreeView ContextMenu неработающие события (ContextMenu Открытое событие не срабатывает), я пытаюсь решить проблему Caliburn.Micro.Telerik не решить проблему.TreeView ContextMenu неработающие события

TreeViewItemTemplate

<HierarchicalDataTemplate x:Key="TreeViewItemTemplate" ItemsSource="{Binding Types}" 
    ItemTemplateSelector="{StaticResource NamespaceItemTemplateSelector}"> 
<StackPanel Orientation="Horizontal"> 
    <Path 
      Data="" 
      Height="11.458" Margin="0,0,5,0" RenderTransformOrigin="0.5,0.5" Stretch="Fill" 
      UseLayoutRounding="False" Width="11.264"> 
     <Path.Fill> 
      <SolidColorBrush Color="#FF333333"> 
       <SolidColorBrush.RelativeTransform> 
        <MatrixTransform Matrix="Identity" /> 
       </SolidColorBrush.RelativeTransform> 
       <SolidColorBrush.Transform> 
        <MatrixTransform Matrix="Identity" /> 
       </SolidColorBrush.Transform> 
      </SolidColorBrush> 
     </Path.Fill> 
     <Path.RenderTransform> 
      <TransformGroup> 
       <ScaleTransform /> 
       <SkewTransform /> 
       <RotateTransform /> 
       <TranslateTransform /> 
      </TransformGroup> 
     </Path.RenderTransform> 
    </Path> 
    <TextBlock Text="{Binding Header}" Tag="{Binding DataContext, RelativeSource={RelativeSource Self}}"> 
    <TextBlock.ContextMenu> 
<ContextMenu cal:Action.TargetWithoutContext="{Binding RelativeSource={RelativeSource Self},Path=UIElement.Tag}" cal:Message.Attach="[Event Opened] = [Action Opened($dataContext)]" > 
     <MenuItem Header="NewChild" cal:Message.Attach="NewChild($datacontext)"/> 
     </ContextMenu> 
    </TextBlock.ContextMenu> 
    </TextBlock> 
</StackPanel> 

TreeView

<TreeView x:Name="TreeView" ItemTemplate="{StaticResource TreeViewItemTemplate}" ItemsSource="{Binding Source}"/> 
+0

Ваша проблема с событием, которое не срабатывает, или соглашениями Caliburn.Micro не работают с вашим контекстным меню? –

+0

Спасибо за ответ, Caliburn.Micro conventions работали, но события ContextMenu и MenuItem не срабатывали. – Cipher

+0

@Sniffer У него нет решения? Если вы хотите загрузить проект. Пожалуйста, помогите мне. Благодарю. – Cipher

ответ

4

Прежде чем я скажу вам, что была проблема, я хочу отметить, что версия кода Загруженные немного отличается от того, который вы опубликовали в своем вопросе.

ОК, проблема заключается именно в этом разделе шаблона:

<TextBlock Text="{Binding Header}" Tag="{Binding DataContext, RelativeSource={RelativeSource Self}}"> 
    <TextBlock.ContextMenu> 
     <ContextMenu cal:Action.TargetWithoutContext="{Binding RelativeSource={RelativeSource Self},Path=UIElement.Tag}" cal:Message.Attach="[Event Opened] = [Action Opened($dataContext)]" > 
      <MenuItem Header="NewChild" cal:Message.Attach="NewChild($datacontext)"/> 
     </ContextMenu> 
    </TextBlock.ContextMenu> 
</TextBlock> 

Чтобы исправить это вам нужно заменить его с этой модифицированной версии:

<TextBlock Text="{Binding Header}" Tag="{Binding DataContext, RelativeSource={RelativeSource Self}}"> 
    <TextBlock.ContextMenu> 
     <ContextMenu cal:Action.TargetWithoutContext="{Binding RelativeSource={RelativeSource Self},Path=PlacementTarget.Tag}" cal:Message.Attach="[Event Opened] = [Action ContextMenuOpened($source)]"> 
      <MenuItem Header="New" cal:Message.Attach="[Event Click] = [Action ClickMenuItem($source)]"/> 
     </ContextMenu> 
    </TextBlock.ContextMenu> 
</TextBlock> 

Проблема была вызвана три вопроса:

  1. В шаблоне и конкретно в этой строке кода <ContextMenu cal:Action.TargetWithoutContext="{Binding RelativeSource={RelativeSource Self},Path=UIElement.Tag}"Path=UIElement.Tag вызывал ошибку привязки, потому что нет свойства по типу ContextMenu, которое называется UIElement. Вместо этого вы должны заменить это с помощью свойства PlacementTarget, которое представляет элемент в пользовательском интерфейсе, на котором было открыто контекстное меню.
  2. Вторая проблема заключается в том, что вы помещали методы, которые обрабатывали эти события в неправильном классе. Они не должны быть на ShellViewModel, потому что в шаблоне вы устанавливаете Action.Target как DataContext за TextBlock, который на самом деле NamespaceViewModel в вашей ситуации, поэтому методы должны идти на NamespaceViewModel.
  3. Третья и последняя проблема заключается в том, что у ваших методов была неправильная подпись, поэтому они не могли быть найдены Caliburn.Micro. Я имею в виду, что вы объявляете свой метод ContextMenuOpened следующим образом: void ContextMenuOpened(sender args, RoutedEventArgs args);, но в шаблоне вы вызываете метод следующим образом: [Action ContextMenuOpened($source)], который отправляет метод FrameworkElement, который вызвал событие (ContextMenu в этом случае), поэтому вы должны измените подпись метода для этого события на следующее: void ContextMenuOpened(ContextMenu source) или более общее void ContextMenuOpened(FrameworkElement source).

Резюме:

  1. Исправьте шаблон использовать PlacementTarget свойство.
  2. Переместите свои методы на NamespaceViewModel.
  3. Исправить ваши подписи методов.

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

+0

решил мою проблему, спасибо за подробное объяснение. Удачи. – Cipher

+0

@SteveQueen, пожалуйста. –

+1

Спасибо за этот ответ. Я не мог понять, почему это не сработало. Я вижу ясно сейчас. –

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