我有一个我希望绑定到WPF网格的集合。
我面临的问题是列数是动态的,并且依赖于集合。这是一个简单的模拟:
public interface IRows
{
string Message{get;}
IColumns[] Columns{get;}
}
public interface IColumns
{
string Header {get;}
AcknowledgementState AcknowledgementState{get;}
}
public interface IViewModel
{
ObservableCollection<IRows> Rows {get;}
}
我希望我的视图绑定到Rows集合,该集合包含一组Columns。
My Columns集合包含一个应由图像表示的枚举(3种可能性中的1种)。它还包含一个Message属性,该属性只能显示在一列中(静态且只是一些文本信息)。它还包含一个Header字符串,该字符串应显示为该列的标题。
请注意,列数是可变的(当标题设置为Acknowledge时,但这将更改为表示动态数据)。
更新:这是在实施Rachel
的建议之后 <ItemsControl
ItemsSource="{Binding Items, Converter={StaticResource PresentationConverter}}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Grid ShowGridLines="true"
local:GridHelpers.RowCount="{Binding RowCount}"
local:GridHelpers.ColumnCount="{Binding ColumnCount}" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemContainerStyle>
<Style>
<Setter Property="Grid.Row" Value="{Binding RowIndex}"/>
<Setter Property="Grid.Column" Value="{Binding ColumnIndex}"/>
</Style>
</ItemsControl.ItemContainerStyle>
<ItemsControl.ItemTemplate>
<DataTemplate>
<ContentControl Content="{Binding}">
<ContentControl.Resources>
<DataTemplate DataType="{x:Type UI:MessageEntity}">
<TextBox Text="{Binding Message}"></TextBox>
</DataTemplate>
<DataTemplate DataType="{x:Type UI:StateEntity}">
<TextBox Text="{Binding State}"></TextBox>
</DataTemplate>
</ContentControl.Resources>
</ContentControl>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
这几乎给了我现在想要的东西。我只是坚持我应该为标题做什么。 欢迎任何建议。
答案 0 :(得分:6)
您可以将嵌套ItemsControls
用于此
这是一个基本的例子:
<!-- Bind Rows using the default StackPanel for the ItemsPanel -->
<ItemsControl ItemsSource="{Binding Rows}">
<!-- Set the Template for each row to a TextBlock and another ItemsControl -->
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<!-- Need to set Width of name TextBlock so items line up correctly -->
<TextBlock Width="200" Text="{Binding Name}" />
<ItemsControl ItemsSource="{Binding Columns}">
<!-- Use a horizontal StackPanel to display columns -->
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
答案 1 :(得分:2)
使用网格方法可能会使事情变得更加复杂。您是否尝试更改列表视图的模板,或者为此目的使用DataGrid?
举个例子,看看这个项目:http://www.codeproject.com/Articles/25058/ListView-Layout-Manager
或者这一个:http://www.codeproject.com/Articles/16009/A-Much-Easier-to-Use-ListView
如果你使用网格,我相信你将不得不添加大量代码来管理列数和行数,它们的大小,单元格内容......而ListView / DataGrid会让你做这可以通过模板动态实现。
答案 2 :(得分:1)
使用http://msdn.microsoft.com/en-us/library/system.windows.controls.grid(v=vs.90).aspx#feedback
所示的代码创建网格创建ColumnDefinition类型的属性(并使用属性已更改)来创建列。
答案 3 :(得分:0)
还可以选择使用动态对象来创建列。这有点费力,但结果非常有效,一般来说解决方案非常灵活。
这将向您展示动态对象的基础知识 Binding DynamicObject to a DataGrid with automatic column generation?
我在使用嵌套对象,具有对象的列然后尝试将单元格内容绑定到对象时遇到了一些麻烦。
以下是我提出的一个如何执行此操作的问题
Problems binding to a the content of a WPF DataGridCell in XAML