我将Grid作为ItemsPanel用于动态绑定到ItemsControl的列表。下面的代码正在工作 - 还有一个问题:我找不到动态初始化网格的ColumnDefinitions和RowDefinitions的方法。因此,所有值都放在彼此之上。
<ItemsControl ItemsSource="{Binding Cells}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Grid/>
</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>
<TextBlock Text="{Binding Value}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
请注意,我正在根据MVVM模式搜索答案。因此,子类和后面的代码只是解决方法,但没有解决方案。
答案 0 :(得分:21)
你需要一些方法告诉网格它有多少行/列。也许在每个项目加载时,您可以检查RowIndex
和ColumnIndex
的值,并在需要时将行/列添加到网格中。
作为另一种选择,也许您可以在ViewModel中公开返回max RowCount
和ColumnCount
的{{1}}和RowIndex
属性,然后在Grid的Loaded事件中添加你需要的很多列/行。
我发现在MVVM中使用代码隐藏是完全可以接受的,因为代码只与UI相关。
另一个想法是将你的代码后面的项目安排到2D网格中,然后再将其返回到View,然后将该Grid与ColumnIndex
绑定到DataGrid并删除标题
<强>更新强>
我目前解决此问题的方法是为AutoGenerateColumns=True
使用一组AttachedProperties
,允许您将Grid
和RowCount
属性绑定到ViewModel上的属性
您可以在我的博客here上找到我的附加属性版本的代码,它们可以像这样使用:
ColumnCount
答案 1 :(得分:4)
您的网格没有行和列,因此所有内容都会显示在彼此之上。做类似下面的事情,它会起作用。
<ItemsControl ItemsSource="{Binding Cells}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
</Grid>
</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>
<TextBlock Text="{Binding Value}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
答案 2 :(得分:0)
我在这里The ItemsControl
找到了这个 <ItemsControl ItemsSource="{Binding VehicleMakes}" >
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<UniformGrid Columns="3" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Button Width="300" Height="100" Click="ButtonOption_Click" Tag="{Binding Name}">
<StackPanel Orientation="Vertical">
<Image
Initialized="Image_Initialized"
Tag="{Binding ResourseImageName}"
Width="116"
Height="30"
Margin="0,0,0,10" >
</Image>
<TextBlock Text="{Binding Name}" VerticalAlignment="Bottom" HorizontalAlignment="Center"/>
</StackPanel>
</Button>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>