代码之家  ›  专栏  ›  技术社区  ›  emptyset

WPF ItemsControl:似乎无法获取要在视图中显示的项目

  •  3
  • emptyset  · 技术社区  · 15 年前

    我正在处理的代码是WPF应用程序的一部分,它应该显示一组用户可以交互的扑克牌。我正在使用三个用户控件:

    • 主控
    • 卡片堆垛控制

    在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对应于该窗口中选项卡控件上的“工作空间”ViewModel。当然,这个例子应该水平地布局每个控件,现在还可以——我还在学习WPF。

    2 回复  |  直到 15 年前
        1
  •  5
  •   Thomas Levesque    15 年前

    你申报的方式 ItemsPanelTemplate 不正确:您将其声明为 ItemsControl . 你应该这样做:

        <ItemsControl 
            ItemsSource="{Binding Path=CardStacks}"
            >
            <ItemsControl.ItemsPanel>
              <ItemsPanelTemplate>
                <StackPanel Orientation="Horizontal" IsItemsHost="True" />
              </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
        </ItemsControl>
    
        2
  •  2
  •   itowlson    15 年前

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

    ItemTemplate="{StaticResource MainTemplate}"

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