将ItemsControl显示为单个数据网格行

时间:2017-12-11 15:11:53

标签: wpf xaml itemscontrol

我有以下用于显示viewModel集合的ItemsControl。

<Border>
    <ItemsControl ItemsSource="{Binding MyViewModel.MyCollection}">
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <StackPanel Orientation="Horizontal" HorizontalAlignment="Center"  Margin="20"/>
            </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
            <ItemsControl.ItemTemplate>
            <DataTemplate>
                <ContentControl Content="{Binding}"/>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
     </ItemsControl>
</Border>

背后的代码是:

MyCollection = new ObservableCollection<ViewModel>();

foreach(var model in MyModelList)
{
    var myViewModel = new ViewModel(model);

    MyCollection.Add(myViewModel);
}

现在这很好用。但是现在我想没有ItemsControl,因为只有两个项目将被添加到MyCollection ObservableCollection中。

我想将两个viewModel中的每一个添加到单行datagrid中的各自列中,以便以不同方式显示网格列。 (例如,当用户点击一个viewModel时,我想仅更改该列的datagird背景)

如何修改上述内容才能执行此操作?

2 个答案:

答案 0 :(得分:2)

创建一个包含两个视图模型的类:

public class RowOfViewModels
{
    public ViewModel ViewModelA { get; set; }
    public ViewModel ViewModelB { get; set; }
}

...并将ItemsSource的{​​{1}}属性设置或绑定到包含此实例的单个实例的集合:

DataGrid

<强> XAML:

dataGrid.ItemsSource = new List<RowOfViewModels>(1) { ViewModelA = new ViewModel(), ViewModelB = new ViewModel() };

答案 1 :(得分:0)

您可以在特定列中创建Cell的模板(请参阅this question),例如:

<DataGridTemplateColumn Header="...">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
           <ContentControl Content="{Binding}"/>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>