Silverlight 将列表框绑定到屏幕集合(小部件)

Silverlight 将列表框绑定到屏幕集合(小部件),silverlight,xaml,data-binding,mvvm,caliburn.micro,Silverlight,Xaml,Data Binding,Mvvm,Caliburn.micro,鉴于我有以下小部件(以及附加的视图): 我可以在另一个视图中轻松地使用和显示它。“托管”小部件的视图模型如下所示: public class WidgetWorkspaceViewModel : Screen { private Screen myWidget = new MyWidgetViewModel(); public Screen MyWidget { get { return myWidget; } set { myWidge

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

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

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

    public Screen MyWidget
    {
        get { return myWidget; }
        set { myWidget = value; }
    }
}
控件显示在WidgetWorkspaceView上,如下所示:

<ContentControl x:Name="OneWidget"/>
private List<Screen> widgets;

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

这一切都很好。但是现在我想更改它,以便WidgetWorkspaceViewModel将包含一组小部件,并且WidgetWorkspaceView应该一个接一个地显示它们。我在这方面遇到了一些问题

视图模型应如下所示:

<ContentControl x:Name="OneWidget"/>
private List<Screen> widgets;

public List<Screen> Widgets
{
    get { return widgets; }
    set { widgets = value; NotifyOfPropertyChange(() => Widgets); }
}
私有列表小部件;
公共列表小部件
{
获取{return widgets;}
设置{widgets=value;NotifyOfPropertyChange(()=>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来帮助进行绑定。

我认为问题在于Caliburn.Micro将自动为ItemsControl定义ItemTemplate,您将覆盖它,因此您需要从列表框中删除它,或者如果您想定义它,然后使用
视图
附加属性设置模型

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


请注意,您也可以使用
导体
作为
WidgetWorkspaceViewModel
类型,而不是维护自己的
屏幕
列表,例如
Conductor.Collection.OneActive
Conductor.Collection.AllActive
。这些导体有一个
项集,并支持屏幕生命周期。

我认为问题在于Caliburn.Micro将自动为ItemsControl定义ItemTemplate,您将覆盖它,因此您需要从列表框中删除它,或者如果您想定义它,然后使用
视图
附加属性设置模型

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


请注意,您也可以使用
导体
作为
WidgetWorkspaceViewModel
类型,而不是维护自己的
屏幕
列表,例如
Conductor.Collection.OneActive
Conductor.Collection.AllActive
。这些导体有
集合,并支持屏幕生命周期。

非常好,感谢您的帮助!我通过删除ItemTemplate定义解决了这个问题,我将研究如何使用导体。非常好,谢谢您的帮助!我通过删除ItemTemplate定义解决了这个问题,我将研究如何使用导体。