2009-09-25 68 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