我有一个包含一些数据的WPF DataGrid
。我想设置列的宽度,使内容适合并永远不会被裁剪(相反,水平滚动条应可见)。此外,我希望DataGrid
可以填满整个空间(我正在使用DockPanel
)。我使用下面的代码(简化):如何设置DataGridColumn的宽度以适应内容(“Auto”),但是完全填充MVVM中DataGrid的可用空间?
<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中得到更新,我无法想象从那里做的一种方式,因为我无法访问DataGridColumn
的ActualWidth
属性。另外,如果可能的话,我只想在XAML中执行此操作。
我将不胜感激任何帮助。谢谢!
编辑:由于我仍然不知道该怎么做,我开始一个小赏金。我会很高兴提出一个建议,可以对我的问题做些什么。再次感谢!
编辑2:在saus的回答之后,我再次考虑了选项。问题是我需要在应用程序运行期间更新Width
和MinWidth
属性,所以不仅在加载窗口之后。我已经试过当DataGrid
的根本ItemsSource
正在更新被解雇一些事件做一些像
column.Width = new DataGridLength(1, DataGridLengthUnitType.Auto);
column.MinWidth = column.ActualWidth;
column.Width = new DataGridLength(1, DataGridLengthUnitType.Star);
。但是,这不起作用,ActualWidth
属性在Auto
上设置Width
后似乎没有更改。有没有一种选择来“重画”它,以获得ActualWidth
属性更新?谢谢!
我不知道我明白你想在这里做什么。如果列的宽度比您想要垂直滚动条的`DataGrid`宽,并且不希望文本换行?你的意思是一个水平滚动条?否则,这对我来说没有意义,但也许我只是在这里缓慢:) – 2011-02-17 09:55:09
感谢您的提示!当然,我的意思是一个水平滚动条,它不会有任何意义,否则;-) – 2011-02-17 13:13:08