2009-09-25 87 views
3

我正在處理的代碼是WPF應用程序的一部分,該應用程序應顯示一組用戶可與之交互的撲克牌堆棧。因此,有三個用戶控件我的工作:WPF ItemsControl:似乎無法讓項目在視圖中顯示

  • MainControl
  • CardStackControl
  • CardControl

在MainControl.xaml:

<StackPanel 
     Grid.Row="0" 
     Orientation="Horizontal"> 
     <ItemsControl 
      ItemsSource="{Binding Path=CardStacks}" 
      > 
      <ItemsPanelTemplate> 
       <StackPanel Orientation="Horizontal" /> 
      </ItemsPanelTemplate> 
     </ItemsControl> 
    </StackPanel> 

我的數據模板中定義的Resources.xaml文件:

<DataTemplate x:Key="MainTemplate" DataType="{x:Type ViewModel:MainViewModel}"> 
    <View:MainControl /> 
</DataTemplate> 

<DataTemplate DataType="{x:Type ViewModel:CardStackViewModel}"> 
    <View:CardStackControl /> 
</DataTemplate> 

<DataTemplate x:Key="CardTemplate" DataType="{x:Type ViewModel:CardViewModel}"> 
    <View:CardControl /> 
</DataTemplate> 

CardStackControl.xaml:

<StackPanel Orientation="Vertical"> 
    <TextBlock 
     Height="30" 
     HorizontalAlignment="Center" 
     VerticalAlignment="Center" 
     Text="{Binding Path=CardName}" 
     /> 
    <ItemsControl 
     Height="Auto" 
     ItemsSource="{Binding Path=Cards}" 
     ItemTemplate="{StaticResource CardTemplate}" 
     > 
     <ItemsPanelTemplate> 
      <StackPanel Orientation="Horizontal" /> 
     </ItemsPanelTemplate> 
    </ItemsControl> 
    <TextBlock 
     Height="30" 
     HorizontalAlignment="Center" 
     VerticalAlignment="Center" 
     Text="{Binding Path=Count}" 
     /> 
</StackPanel> 

CardControl.xaml:

<TextBlock 
     Name="TitleTextBlock" 
     Grid.Row="0" 
     Grid.Column="1"     
     HorizontalAlignment="Center"     
     VerticalAlignment="Center" 
     Text="{Binding Path=Name}" 
     >  

MainViewModel:

public ObservableCollection<CardStackViewModel> CardStacks; 

// ... 

CardStackViewModel:

public class CardStackViewModel 
{ 
    private CardStack Model; 

    public string CardName 
    { 
     get 
     { 
      return this.Model.CardType.Name; 
     } 
    } 

    public int Count 
    { 
     get 
     { 
      return this.Model.Cards.Count; 
     } 
    } 

    public ObservableCollection<CardViewModel> Cards { get; private set; } 

    // ... 

CardViewModel:

/// <summary> 
    /// A reference to the Card type. 
    /// </summary> 
    private Card Model; 

    /// <summary> 
    /// Retrieves the name of the card. 
    /// </summary> 
    public string Name 
    { 
     get 
     { 
      return this.Model.CardType.Name; 
     } 
    } 

    public string Caption 
    { 
     get 
     { 
      return this.Model.CardType.Text; 
     } 
    } 

    // ... 

在MainViewModel,CardStackViewModel構造,兩者的ObservableCollection實例被初始化,填充和填充有一些測試數據。

當我加載應用程序並創建MainViewModel時,UserControls不顯示,並且沒有任何測試數據可見。我使用this tutorial作爲指導,以便MainViewModel對應於該窗口中選項卡式控件上的「Workspaces」ViewModel。當然,這個例子應該水平佈局每個控件,這對我來說已經很好了 - 我仍然在學習WPF。

顯然,我已經放棄了.xaml文件和其他腳手架代碼中的代碼生成標記(如果從這些示例中不清楚,我可以修改此代碼以發佈該代碼)。我現在只測試/綁定Model類的字符串屬性。

回答

5

您聲明ItemsPanelTemplate的方式不正確:您將其聲明爲ItemsControl的一個項目。你應該這樣做:

<ItemsControl 
     ItemsSource="{Binding Path=CardStacks}" 
     > 
     <ItemsControl.ItemsPanel> 
      <ItemsPanelTemplate> 
      <StackPanel Orientation="Horizontal" IsItemsHost="True" /> 
      </ItemsPanelTemplate> 
     </ItemsControl.ItemsPanel> 
    </ItemsControl> 
+0

謝謝你的收穫,今晚要解決這個問題。 – emptyset 2009-09-28 21:09:11

2

MainControl.xaml中的ItemsControl未指定ItemTemplate。地址:

ItemTemplate="{StaticResource MainTemplate}"

我想你還需要到DataContext例如向下傳播上的用戶控件

<DataTemplate x:Key="MainTemplate" DataType="{x:Type ViewModel:MainViewModel}"> 
    <View:MainControl DataContext="{Binding}" /> 
</DataTemplate> 

(並且對其他數據模板中的其他用戶控件類似)。

+0

+1事實上,微軟沒有適當地記錄任何地方使用{綁定},我也發現這是一個意外。 – 2009-09-25 06:27:56

+0

我今晚會檢查一下... – emptyset 2009-09-28 21:08:29

相關問題