我有一个viewmodel,它包含对象名称MyLabel的ObservableCollection。这些对象有3个属性(content,rowNr,columnNr),它们应分别绑定到Content,Grid.Row和Grid.Column属性。
我定义ItemsControl的原因是因为它在我的网格中没有工作,也就是说我无法绑定rowNr和columnNr,因为网格Grid.Column /Grid.Row属性会一直覆盖我的数据。
如何使这项工作成为我的标签在网格内?
<StackPanel>
<ItemsControl ItemsSource="{Binding Path=MyLabelList}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Label Content="{Binding content}" Grid.Column="{Binding columnNr}" Grid.Row="{Binding rowNr}" Style="{StaticResource MyLabel}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
</Grid>
</StackPanel>
答案 0 :(得分:1)
尝试使用Grid
作为ItemsPanel
的{{1}}:
ItemsControl
答案 1 :(得分:1)
您必须在[{1}}
上以编程方式将绑定设置为ItemContainer
GetContainerForItemOverride()
在这样的视图中:
public class GridItemsControl : ItemsControl
{
protected override DependencyObject GetContainerForItemOverride()
{
FrameworkElement fwE = base.GetContainerForItemOverride() as FrameworkElement;
fwE.SetBinding(Grid.ColumnProperty, "columnNr");
fwE.SetBinding(Grid.RowProperty, "rowNr");
return fwE;
}
}
您还可以实现一个自己的网格,生成所需的行数和列数。
这个技巧非常合法。
其他信息
您的<custom:GridItemsControl>
<custom:GridItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Grid>
<Grid.ColumnDefinitions>
<!-- Add here -->
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<!-- Add here -->
</Grid.RowDefinitions>
</Grid>
</ItemsPanelTemplate>
</custom:GridItemsControl.ItemsPanel>
</custom:GridItemsControl>
不会直接添加到ItemTemplate
(在您的情况下为ItemsPanel
),总共有Grid
或类似的内容,因为您正在使用ContentPresenter
1}}。所以你必须这样。
为了让它更具有合法性,你可以想象它是这样的:
DataTemplate
答案 2 :(得分:1)
Grid
和ItemsControl
不能很好地协同播放,但您可以参考以下博文:
使用网格作为ItemsControl的面板: http://blog.scottlogic.com/2010/11/15/using-a-grid-as-the-panel-for-an-itemscontrol.html
另一种选择可能是&#34;手动&#34;在视图中动态地将<RowDefinition>
和<ColumnDefinition>
元素添加到网格中。
答案 3 :(得分:1)
如果您不希望像答案中建议的@Peter那样继承ItemsControl
,则只需使用ItemsControl.ItemContainerStyle
绑定Grid.Column
和Grid.Row
属性:
<ItemsControl ItemsSource="{Binding Path=MyLabelList}">
<ItemsPanelTemplate>
<Grid>
<Grid.ColumnDefinitions>
<!-- Add here -->
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<!-- Add here -->
</Grid.RowDefinitions>
</Grid>
</ItemsPanelTemplate>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Label Content="{Binding content}" Style="{StaticResource MyLabel}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
<ItemsControl.ItemContainerStyle>
<Style TargetType="ContentPresenter">
<Setter Property="Grid.Row" Value="{Binding rowNr}" />
<Setter Property="Grid.Column" Value="{Binding columnNr}" />
</Style>
</ItemsControl.ItemContainerStyle>
</ItemsControl>
但是,正如其他人已经提到的那样,列和行定义不会自动添加,您需要在设计时知道它并静态添加它们,或者您需要找到某种方式在运行时动态添加它们。