【问题标题】:WPF Caliburn Micro Conductors with Menu带有菜单的 WPF Caliburn 微导体
【发布时间】:2016-09-17 22:52:54
【问题描述】:

我目前正在使用 Caliburn Micro 2.0.2 尝试使用 ShellView 顶部的 Menu 进行 Conductor 导航。 MenuItem 的第一级工作正常,但第二级抛出“未找到方法 Select 的目标”。例外。

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);
      }
   }
 }

具有更多视图模型的内部导体具有相同的选择方法和相应的接口类型。我不知道如何让事件连接起来。请帮忙。

【问题讨论】:

    标签: c# wpf menuitem caliburn.micro


    【解决方案1】:

    我让它工作了。与 RelativeSource Self 的绑定是问题所在。我现在已经通过名称绑定到元素。这也允许我在 shell 上只使用一种方法。

    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();
             }
          }
       }       
     }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      • 2020-05-09
      相关资源
      最近更新 更多