2011-03-08 73 views
1

鑑於我有以下的微件(和與它相連的視圖):綁定列表框到屏幕的集合(小部件)

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包含一個Widget集合,而WidgetWorkspaceView應該一個接一個地顯示它們。我在解決這個問題方面遇到了一些問題。

視圖模型應該是這樣的:

private List<Screen> widgets; 

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

的這部分代碼是OK的,因爲我已經綁定的窗口小部件的組合框和組合框正確地顯示一個列表控件。但是我在視圖上「託管」小部件時遇到了問題。這是我試過的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

我認爲這個問題是Caliburn.Micro自動定義的ItemTemplate爲一個ItemsControl,你會被重寫,所以你要麼需要從ListBox中刪除,或者如果你想定義它,然後使用附加屬性View來設置模型。

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

注意,你也可以使用一個ConductorConductor<IScreen>.Collection.OneActiveConductor<IScreen>.Collection.AllActive爲您WidgetWorkspaceViewModel類型,而不是維護自己的Screen列表。這些導體有一個Items集合,並支持屏幕生命週期。

+0

非常好,謝謝你的幫助!我通過刪除ItemTemplate定義解決了這個問題,我將考慮使用Conductor。 – 2011-03-08 10:00:39