使用Caliburn.Micro将命令绑定到ListView内的Button

Tig*_*ine 12 c# data-binding wpf mvvm caliburn.micro

我正在尝试创建类似于MDI选项卡式界面的东西,因此左侧有一个导航窗格(一个列表框),右侧有一个ContentPresenter.

我有一个ShellViewModel,它上面有一个名为AvailAbleScreens的BindableCollection,我成功地使用ListViews DataTemplate绑定到该列表:

<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>
Run Code Online (Sandbox Code Playgroud)

现在的问题是,虽然Button的名称设置正确,但我不能让Command为我火.在MdiViewModel类上,我有以下代码用于该按钮:

public bool CanDisplayView()
{
    return true;
}

public void DisplayView()
{
    MessageBox.Show("Hello");
}
Run Code Online (Sandbox Code Playgroud)

所有的Caliburn.Micro示例都通过约定绑定到x:Name属性,但如果我删除Text ="{Binding}"它会停止工作,所以我怀疑这种数据绑定方式对子模型不起作用?

无论如何,Shell的ViewModel目前非常简单:

ShellViewModel
 * AvailableScreens
    -MdiViewModel1
    -MdiViewModel2
 * CurrentActiveScreen
Run Code Online (Sandbox Code Playgroud)

任何想法我如何用Caliburn.Micro做到这一点?Rob Eisenberg在Twitter上向我建议我可能想要在进入完全成熟的Caliburn框架之前开始使用Caliburn.Micro.

Eis*_*ect 20

遗憾的是,我们无法自动将约定应用于DataTemplates的内容.原因是我们无法拦截WPF/Silverlight的模板创建机制.要解决这个问题,您有几个选择:

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

  2. 将所有DataTemplates解压缩到UserControls中,这将重新引用UserControl上的约定.这对于大型模板来说是一个好主意,但对于小型模板来说却很乏味

  3. 像这样在DataTemplate Bind.Model的根上使用附加属性.执行此操作将导致约束与DataTemplate绑定.不幸的是,由于Caliburn中的一些错误,这可能无法正常工作.它确实在Caliburn.Micro中工作.我希望尽快解决这个问题.UIElementBind.Model="{Binding}"