WPF:获取System.Windows.Data有关更改网格中的行的错误

时间:2010-01-30 01:28:08

标签: c# wpf windows

我有一个网格,我根据窗口的大小动态地根据列数调整大小。

我找到的唯一方法是使用:

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:路径= Horizo​​ntalContentAlignment;   的DataItem = NULL;目标元素是   'ListViewItem'(Name ='');目标   财产是   'Horizo​​ntalContentAlignment'(类型   '的Horizo​​ntalAlignment')

1 个答案:

答案 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。