使用UserControl作为ItemsControl的项目模板

时间:2017-08-29 14:35:50

标签: c# wpf

好的,我认为已经提出了类似的问题,但我无法解决这个问题。我有一个带有这样的ItemsControl的视图:

<Grid Background="White">
        <Grid.RowDefinitions>
            <RowDefinition Height="50"/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <Label Content="Model Health Report:" Margin="10,10,10,0" Height="26" VerticalAlignment="Top" FontWeight="Bold"/>
        <ItemsControl Grid.Row="1" 
                      ItemsSource="{Binding HealthReports, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
            <ItemsControl.ItemTemplate>
                <DataTemplate DataType="{x:Type hr:HealthReportSummaryControl}"/>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
    </Grid>

这背后有一个视图模型:

public class CommunicatorViewModel : ViewModelBase
{
    public ObservableCollection<HealthReportSummaryViewModel> HealthReports { get; set; }
    public CommunicatorModel Model { get; set; }

    public CommunicatorViewModel(HealthReportData data)
    {
        Model = new CommunicatorModel();
        HealthReports = new ObservableCollection<HealthReportSummaryViewModel>
    {
        new HealthReportSummaryViewModel {Title = "View1", Description = "Some desc."},
        new HealthReportSummaryViewModel {Title = "View2", Description = "Some desc."}
    };
}

}

如您所见,我将它绑定到HealthReportSummaryViewModel对象的ObservableCollection。这些填充在构造函数中。我在运行时检查了对象,它们是正确的。

实际控件如下所示:

<Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="50"/>
            <ColumnDefinition Width="2"/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <Ellipse Grid.Column="0" 
                 Fill="{Binding FillColor}"  
                 Margin="2"/>
        <Rectangle Grid.Column="1" 
                   Fill="DarkGray"
                   Margin="0,2"/>
        <Label Content="{Binding Title}" 
               Grid.Column="2" 
               Margin="5,0,10,0" 
               VerticalAlignment="Top"/>
        <TextBlock Grid.Column="2" 
                   Margin="5,10,10,0" 
                   TextWrapping="Wrap" 
                   Text="{Binding Description}"/>
    </Grid>

使用视图模型:

public class HealthReportSummaryViewModel : ViewModelBase
    {
        private System.Windows.Media.Color _fillColor;
        public System.Windows.Media.Color FillColor {
            get { return _fillColor; }
            set { _fillColor = value; RaisePropertyChanged(() => FillColor); }
        }

        private string _title;
        public string Title
        {
            get { return _title; }
            set { _title = value; RaisePropertyChanged(() => Title); }
        }

        private string _description;
        public string Description
        {
            get { return _description; }
            set { _description = value; RaisePropertyChanged(() => Description); }
        }
    }

我没有例外,但我的窗口只有空项目。用户控件中有一个不依赖于数据绑定的矩形,所以这可能是内容大小的问题?我无法解决这个问题。一切都是空白的。我是否需要以某种方式设置每个ItemsControl项目的大小,还是只调整它们所放置的网格的大小?我在这里失踪了什么?所有帮助将不胜感激。

1 个答案:

答案 0 :(得分:3)

您的DataTemplate定义错误:

<ItemsControl.ItemTemplate>
    <DataTemplate DataType="{x:Type hr:HealthReportSummaryControl}"/>
</ItemsControl.ItemTemplate>

这为HealthReportSummaryControl类型的项目定义了一个空数据模板。

相反,你应该这样定义:

<ItemsControl.ItemTemplate>
    <DataTemplate DataType="{x:Type hr:HealthReportSummaryViewModel}">
        <hr:HealthReportSummaryControl/>
    </DataTemplate>
</ItemsControl.ItemTemplate>

这定义了HealthReportSummaryViewModel项目的模板。