【发布时间】:2011-06-27 05:22:27
【问题描述】:
我有一个包含一些数据的 WPF DataGrid。我想设置列的宽度,以便内容适合并且永远不会被裁剪(相反,水平滚动条应该变得可见)。此外,我希望DataGrid 能够填满整个可用位置(我正在使用DockPanel)。我正在使用以下代码(简化):
<DataGrid ItemsSource="{Binding Table}">
<DataGrid.Columns>
<DataGridTextColumn MinWidth="100" Width="Auto" Header="Column 1" Binding="{Binding Property1}" />
<DataGridTextColumn MinWidth="200" Width="Auto" Header="Column 2" Binding="{Binding Property2}" />
</DataGrid.Columns>
</DataGrid>
这显然不适用于 Width="Auto",因为它总是看起来像这样:
这显然看起来很难看。我希望选择整行,或者更好的是选择列来填充整个宽度,但正如大家所见,这不起作用。
如果我改用Width="*",列的内容会被裁剪,这对我来说更糟。
我找到了similar question here,并在那里发布了解决方法。这可能有效,但我正在使用 MVVM 模式,所以 ItemsSource 在 ViewModel 中得到更新,我想不出从那里做的方法,因为我无法访问 ActualWidth 属性DataGridColumn 的。另外,如果可能的话,我想只在 XAML 中进行。
如果有任何帮助,我将不胜感激。谢谢!
编辑:由于我仍然不知道该怎么做,我开始了一个小赏金。我会很高兴有人提出可以解决我的问题的建议。再次感谢!
编辑 2:在 saus 的回答之后,我再次考虑了这些选项。问题是我需要在应用程序运行期间更新Width 和MinWidth 属性,所以不仅在加载窗口之后。我已经尝试过做类似的事情
column.Width = new DataGridLength(1, DataGridLengthUnitType.Auto);
column.MinWidth = column.ActualWidth;
column.Width = new DataGridLength(1, DataGridLengthUnitType.Star);
在DataGrid 的底层ItemsSource 更新时触发的某些事件。但是,这不起作用,因为在 Auto 上设置 Width 后,ActualWidth 属性似乎没有改变。是否可以选择以某种方式“重新绘制”它以更新 ActualWidth 属性?谢谢!
【问题讨论】:
-
我不确定我是否了解您想在这里做什么。如果列的宽度比
DataGrid更宽,您想要一个垂直滚动条并且不希望文本换行?你的意思是水平滚动条吗?否则,这对我来说毫无意义,但也许我在这里很慢:) -
感谢您的提示!当然我的意思是水平滚动条,否则它没有任何意义;-)