2015-03-05 3 views
0

У меня есть MasterView, у которого есть привязка TabControl с ListView. Я разделил List на вторичный вид, потому что хочу выделить два вида. ListView должен выполнить некоторую операцию, которая не имеет ничего общего с MasterView.Caliburn.Micro ListBox с ContextMenu Не найдено цели

Здесь код MasterView.xaml

<Window 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:cal="http://www.caliburnproject.org" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:view="clr-namespace:App" 
    mc:Ignorable="d" x:Class="App.MasterView" 
    Title="Setup Cylinder" 
    WindowStartupLocation="CenterScreen" 
    Height="732" Width="986" > 
<Grid Margin="0,0,0,0" Background="#FF837F80" > 
    <TabControl SelectedIndex="{Binding CycleIndex}" Grid.Column="0" ItemsSource="{Binding Items}" Margin="0,5,0,10"> 
     <TabControl.ItemTemplate> 
      <DataTemplate> 
       <TextBlock Text="{Binding Name}"/> 
      </DataTemplate> 
     </TabControl.ItemTemplate> 
     <TabControl.ContentTemplate> 
      <DataTemplate> 
       <ContentControl cal:View.Model="{Binding}" VerticalContentAlignment="Stretch" HorizontalContentAlignment="Stretch" IsTabStop="False" /> 
      </DataTemplate> 
     </TabControl.ContentTemplate> 
    </TabControl> 
</Grid> 

Внутри MasterViewModel.cs есть функция, называемая пустота общественного MenuItem_Open(). Я хочу добавить меню внутри ListView, которое вызывает MenuItem_Open() для MasterViewModel.cs.

Вот код ListView.xaml

<UserControl x:Class="App.ListView" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:cal="http://www.caliburnproject.org" 
     xmlns:sys="clr-namespace:System;assembly=mscorlib" 
     xmlns:local="clr-namespace:App" 
     mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="517.5"> 
<Grid Margin="0,0,0,0" x:Name="LayoutRoot"> 
    <ScrollViewer Margin="0,0,0,10" VerticalScrollBarVisibility="Visible" HorizontalScrollBarVisibility="Visible"> 
     <ListBox SelectedIndex="{Binding SelectedStepIndex}" x:Name="Steps" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" HorizontalContentAlignment="Left" VerticalContentAlignment="Center" AlternationCount="2"> 
      <ListBox.ContextMenu> 
       <ContextMenu > 
        <MenuItem Header="New" cal:Message.Attach="[Event Click] = [Action MenuItem_New()]"/> 
        <MenuItem Header="Copy" /> 
        <MenuItem Header="Paste" /> 
       </ContextMenu> 
      </ListBox.ContextMenu> 
     </ListBox> 
    </ScrollViewer> 
    </Grid> 

Проблема не всегда получаю ошибку "Не Target найдено MenuItem_New()".

Я думаю, что проблема связана с визуальным деревом Broken, и я пытаюсь найти больше решений, но каждый раз я терпел неудачу и получаю ту же ошибку. Любые подсказки для решения этой проблемы?

EDIT 1: Binding Error

<UserControl x:Class="App.ListView" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:cal="http://www.caliburnproject.org" 
     xmlns:sys="clr-namespace:System;assembly=mscorlib" 
     xmlns:local="clr-namespace:App" 
     mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="517.5"> 
<Grid Margin="0,0,0,0" x:Name="LayoutRoot"> 
    <ScrollViewer Margin="0,0,0,10" VerticalScrollBarVisibility="Visible" HorizontalScrollBarVisibility="Visible"> 
     <ListBox SelectedIndex="{Binding SelectedStepIndex}" x:Name="Steps" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" HorizontalContentAlignment="Left" VerticalContentAlignment="Center" AlternationCount="2"> 
      <ListBox.ContextMenu> 
       <ContextMenu > 
        <MenuItem Header="New" cal:Message.Attach="[Event Click] = [Action MenuItem_New()]"/> 
        <MenuItem Header="Copy" /> 
        <MenuItem Header="Paste" /> 
<Button Command="{Binding ElementName=LayoutRoot, Path=DataContext.MenuItem_New}"/> 
       </ContextMenu> 
      </ListBox.ContextMenu> 
     </ListBox> 
    </ScrollViewer> 
    </Grid> 

ответ

0

Проблема заключается в том (возможно), что контекст данных о MenuItems не MasterViewModel, но это DataContext из ListBox.

Если я получить доступ к свойствам/методам ViewModel из вложенных элементов, я просто использую это: <Button Command="{Binding ElementName=LayoutRoot, Path=DataContext.ShowSessionDetail}" CommandParameter="{Binding SessionId}">

LayoutRoot это имя элемента, который находится в корне, следовательно, его контекст данных является контекст данных из ViewModel (у вас также есть сетка с тем же именем). Затем в Path вы говорите, что хотите получить доступ к Контексту данных этого элемента, а затем вы можете получить доступ к его методам/свойствам. Это должно сработать и для вас.

+0

Я обновляю вопрос с помощью Edit 1: я пытаюсь добавить вашу кнопку, чтобы проверить, работает ли, но я получил: Ошибка System.Windows.Data: 4: Не удалось найти источник для привязки со ссылкой «ElementName = LayoutRoot». BindingExpression: Path = DataContext.MenuItem_New; DataItem = NULL; целевым элементом является «Button» (Name = ''); target является «Command» (тип «ICommand») – user473349