2016-05-20 15 views
1

現在、Caliburn Micro 2.0.2を使用して、ShellViewのナビゲーションの最上部にメニューを使用しようとしています。 MenuItemの最初のレベルはうまくいきますが、2番目のレベルで「メソッドSelectの対象が見つかりません」がスローされます。例外。メニュー付きWPFキャリバーマイクロコンダクター

ShellViewコード:

<Grid xmlns:cal="http://www.caliburnproject.org" 
    xmlns:cal2="clr-namespace:Caliburn.Micro;assembly=Caliburn.Micro"> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto"/> 
     <RowDefinition Height="*"/> 
    </Grid.RowDefinitions> 
    <Menu VerticalAlignment="Top" ItemsSource="{Binding Items}"> 
     <Menu.Resources> 
     <Style TargetType="MenuItem"> 
      <Setter Property="cal:Message.Attach" 
        Value="[Event Click] = [Action Select($DataContext)]" /> 
      <Setter Property="cal:Action.TargetWithoutContext" 
        Value="{Binding DataContext, RelativeSource={RelativeSource Self}}}"/> 
     </Style> 
     <HierarchicalDataTemplate ItemsSource="{Binding Items}" 
            DataType="{x:Type cal2:Screen}"> 
      <TextBlock Text="{Binding DisplayName}"/> 
     </HierarchicalDataTemplate> 
     </Menu.Resources> 
    </Menu> 
    <ContentControl Grid.Row="1" cal:View.Model="{Binding ActiveItem}"/> 
    </Grid> 

ShellViewModelコード:複数のビューモデルは、対応するインターフェイスタイプと同じ選択方法を有する有し

public class ShellViewModel : Conductor<IScreen>.Collection.OneActive 
{ 
    public ShellViewModel(IEnumerable<IScreen> viewmodels) 
    { 
    //omitted for brevity. 
    } 
    public void Select(object datacontext) 
    { 
     var vm = datacontext as IScreen; 
     if (vm != null && Items.Contains(vm)) 
     { 
     ActivateItem(vm); 
     } 
    } 
} 

内部導体。私はイベントをつなぐ方法を理解できません。助けてください。

答えて

1

私はそれを働かせました。 RelativeSource Selfへのバインディングが問題でした。私は今、名前で要素へのバインディングを持っています。これにより、シェル上に1つのメソッドを持つこともできます。

ShellViewコード:

<Grid xmlns:cal="http://www.caliburnproject.org" 
    xmlns:cal2="clr-namespace:Caliburn.Micro;assembly=Caliburn.Micro"> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto"/> 
     <RowDefinition Height="*"/> 
    </Grid.RowDefinitions> 
    <Menu x:Name="menu" VerticalAlignment="Top" ItemsSource="{Binding Items}"> 
    <Menu.Resources> 
    <Style TargetType="MenuItem"> 
     <Setter Property="cal:Message.Attach" 
       Value="[Event Click] = [Action Select($DataContext)]" /> 
     <Setter Property="cal:Action.TargetWithoutContext" 
       Value="{Binding DataContext, ElementName=menu}"/> 
    </Style> 
    <HierarchicalDataTemplate ItemsSource="{Binding Items}" 
           DataType="{x:Type cal2:Screen}"> 
     <TextBlock Text="{Binding DisplayName}"/> 
    </HierarchicalDataTemplate> 
    </Menu.Resources> 
</Menu>   
<ContentControl Grid.Row="1" cal:View.Model="{Binding ActiveItem}"/> 
</Grid> 

ShellViewModelコード:

public class ShellViewModel : Conductor<IScreen>.Collection.OneActive 
{ 
    public ShellViewModel(IEnumerable<IScreen> viewmodels) 
    { 
    //omitted for brevity. 
    } 
    public void Select(object datacontext) 
    { 
     var vm = datacontext as IScreen; 
     if (vm != null && Items.Contains(vm)) 
     { 
     if (vm.IsActive) 
      return; 
     ActivateItem(vm); 
     vm.Refresh(); 
     } 
     else 
     { 
     var vm2 = datacontext as Screen; 
     if (vm2 != null) 
     { 
      (vm2.Parent as IConductActiveItem)?.ActivateItem(vm2); 
      vm2.Refresh(); 
     } 
     } 
    }  
} 
関連する問題