将ListBox绑定到一组屏幕(小部件)

时间:2011-03-08 05:52:41

标签: silverlight xaml data-binding mvvm caliburn.micro

鉴于我有以下小部件(以及附加的视图):

public class MyWidgetViewModel : Screen {}

我可以在另一个视图中轻松使用和显示它。 “托管”窗口小部件的视图模型如下所示:

public class WidgetWorkspaceViewModel : Screen
{
    private Screen myWidget = new MyWidgetViewModel();

    public Screen MyWidget
    {
        get { return myWidget; }
        set { myWidget = value; }
    }
}

控件在WidgetWorkspaceView上显示如下:

<ContentControl x:Name="OneWidget"/>

这一切都很好用。但现在我想改变它,以便WidgetWorkspaceViewModel包含一个Widgets集合,WidgetWorkspaceView应该一个接一个地显示它们。我在解决这个问题上遇到了一些问题。

视图模型应该如下所示:

private List<Screen> widgets;

public List<Screen> Widgets
{
    get { return widgets; }
    set { widgets = value; NotifyOfPropertyChange(() => Widgets); }
}

这部分代码没问题,因为我已将Widgets绑定到组合框,组合框正确显示控件列表。但是我在视图上“托管”小部件时遇到了问题。这是我尝试在WidgetWorkspaceView中使用的XAML但没有成功:

<ListBox x:Name="Widgets">
    <ListBox.ItemsPanel>
        <ItemsPanelTemplate>
            <toolkit:WrapPanel />
        </ItemsPanelTemplate>
    </ListBox.ItemsPanel>

    <ListBox.ItemTemplate>
        <DataTemplate>
            <ContentControl Width="100" Height="100" DataContext="{Binding}"/>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

基于断点,数据绑定部分工作正常,但我没有得到小工具。

任何想法如何解决这个问题?我正在使用Caliburn.Micro来帮助解决这些问题。

1 个答案:

答案 0 :(得分:1)

我认为问题是Caliburn.Micro会自动为ItemsControl定义ItemTemplate,你将覆盖它,所以你需要从ListBox中删除它,或者如果你想定义它,那么使用View附加属性来设置模型。

<ListBox.ItemTemplate>
  <DataTemplate>
    <ContentControl Width="100" Height="100" cal:View.Model="{Binding}" />
  </DataTemplate>
</ListBox.ItemTemplate>

请注意,您还可以使用Conductor Conductor<IScreen>.Collection.OneActiveConductor<IScreen>.Collection.AllActive作为WidgetWorkspaceViewModel类型,而不是维护自己的Screen列表。这些导体具有Items集合,并支持屏幕生命周期。