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

12

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

我有一个名为ShellViewModel的可绑定集合AvailAbleScreens,并且我成功地使用ListView的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>

现在的问题是,虽然按钮的名称设置正确,但我无法让命令触发。在MdiViewModel类中,我有以下代码来处理该按钮:

public bool CanDisplayView()
{
    return true;
}

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

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

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

ShellViewModel
 * AvailableScreens
    -MdiViewModel1
    -MdiViewModel2
 * CurrentActiveScreen

有没有任何想法可以使用Caliburn.Micro实现这一点?Rob Eisenberg在Twitter上建议我在进入完整的Caliburn框架之前,可能需要从Caliburn.Micro开始。

1个回答

20

很遗憾,我们无法自动应用约定到DataTemplates的内容上。原因是我们没有办法拦截WPF / Silverlight的模板创建机制。为了解决这个问题,您有几个选择:

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

  2. 将所有DataTemplates提取到UserControls中,这样可以重新启用UserControl上的约定。这对于大型模板是一个好主意,但对于小型模板来说会比较繁琐

  3. 在DataTemplate的根UIElement上使用Bind.Model附加属性,像这样Bind.Model =“{Binding}”。这样做将导致约定与DataTemplate绑定。不幸的是,由于Caliburn中的一些错误,这可能不起作用。但是,在Caliburn.Micro中是有效的。我希望能尽快解决这个问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接