我有一个网格,我根据窗口的大小动态地根据列数调整大小。
我找到的唯一方法是使用:
FrameworkElementFactory fGrid = new FrameworkElementFactory
(typeof(System.Windows.Controls.Primitives.UniformGrid));
fGrid.SetValue(System.Windows.Controls.Primitives.UniformGrid.ColumnsProperty, columns);
listbox.ItemsPanel = new ItemsPanelTemplate(fGrid);
在我的listbox_SizeChanged事件处理程序中。可悲的是,它给出了以下(无害)错误。关于如何动态改变它的任何更好的想法?
System.Windows.Data错误:4:不能 找到与参考绑定的源 'RelativeSource FindAncestor, AncestorType = 'System.Windows.Controls.ItemsControl', AncestorLevel = '1'”。 BindingExpression:路径= HorizontalContentAlignment; 的DataItem = NULL;目标元素是 'ListViewItem'(Name ='');目标 财产是 'HorizontalContentAlignment'(类型 '的HorizontalAlignment')
答案 0 :(得分:1)
数据绑定UniformGrid.Columns属性:
<ListBox>
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<UniformGrid Rows="10" Columns="{Binding ColumnCount}" />
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
</ListBox>
然后在SizeChanged处理程序中更新ColumnCount。
这假设您可以在ListBox的DataContext上定义ColumnCount。如果这是不合需要的,您可以轻松地将列计数放在其他可绑定的位置,例如在ListBox上定义附加属性,绑定到该属性并在SizeChanged处理程序中设置附加属性的值。在任何情况下,关键是绑定Columns属性,而不是在代码中重新创建整个ItemsPanelTemplate。