将命令绑定到ListView中的按钮与Caliburn.Micro

问题描述:

我想创建一个像MDI选项卡式界面,所以我有一个左侧的导航窗格(Listbox)和右侧的ContentPresenter。将命令绑定到ListView中的按钮与Caliburn.Micro

我有了一个BindableCollection它称为AvailAbleScreens,我成功地设法绑定到该列表与列表视图的DataTemplate一个ShellViewModel:

<ListView x:Name="AvailableScreens"> 
    <ListView.ItemTemplate> 
     <DataTemplate> 
      <WrapPanel> 
       <BulletDecorator /> 
       <Button x:Name="DisplayView"> 
        <TextBlock Text="{Binding Path=Name, UpdateSourceTrigger=PropertyChanged}" /> 
       </Button> 
      </WrapPanel> 
     </DataTemplate> 
    </ListView.ItemTemplate> 

现在的问题是,虽然按钮的名称设置正确地说,我不能让命令为我着火。 在MdiViewModel类我该按钮的下面的代码:

public bool CanDisplayView() 
{ 
    return true; 
} 

public void DisplayView() 
{ 
    MessageBox.Show("Hello"); 
} 

所有Caliburn.Micro样品通过约定于x结合工作:名称属性,但如果我删除文本=“{结合} “它停止工作,所以我怀疑这种数据绑定方式不适用于子模型?

无论如何,壳牌的视图模型是非常简单的时刻:

ShellViewModel 
* AvailableScreens 
    -MdiViewModel1 
    -MdiViewModel2 
* CurrentActiveScreen 

任何想法我如何与Caliburn.Micro做到这一点? Rob Eisenberg在推特上向我建议,在进入完整的Caliburn框架之前,我可能想先与Caliburn.Micro开始。

不幸的是,我们不能自动将惯例应用于DataTemplates的内容。原因是我们无法拦截WPF/Silverlight的模板创建机制。为了解决这个问题,你有几个选择:

  1. 不要在DataTemplates中使用约定;使用显式绑定和Message.Attach代替

  2. 将所有DataTemplates提取到UserControls中,这将重新遍历UserControl中的约定。这是一个大的模板,小的

  3. 使用Bind.Model附加属性的DataTemplate中的根UIElement这样Bind.Model="{Binding}"一个好主意,但乏味。这样做会导致约定与DataTemplate绑定。不幸的是,由于Caliburn中存在一些错误,这可能不太合适。它确实在Caliburn.Micro中工作。我希望尽快解决这个问题。