DataGrid列宽不自动更新Change的值更新时,其列不会更新以适应新值。所以列保持太小并且值被剪裁。有任何想法吗?DataGrid将增加列大小以适应数据长度,但不会在数据长度减少时自动减小列大小。在您的示例中,您正确对齐了“更改”列并将其余空间用于“名称”列。现在,当“change”属性变得足够大以至于它应该增加列的宽度时,“name”列拒绝缩小以适应,因此您必须自己强制刷新。以下步骤应该为您完成(我提供了一个示例应用程序来演示):1)在DataGridTextColumn绑定中设置NotifyTargetUpdated=True(除*size列之外的所有绑定)。2)在DataGrid上,将处理程序添加到TargetUpdated事件。3)在TargetUpdated事件处理程序中:-a)将DataGrid的*size列的宽度设置为0。-b)在DataGrid上调用UpdateLayout()方法。–c)将DataGrid的*size列的广度设置恢复DataGridLength(1,DataGridLengthUnitType.Star)示例XAML:示例代码背面:usingSystem;使用System.Collections.ObjectModel;使用System.Windows;使用System.Windows.Controls;使用System.Windows.Data;使用System.ComponentModel;namespaceDataGridTest{//////MainWindow.xaml的交互逻辑///publicpartialclassMainWindow:Window{privateObservableCollectionmyObjectList=newObservableCollection();publicMainWindow(){InitializeComponent();(this.FindResource("MyObjectCollection")作为CollectionViewSource).Source=this.myObjectList;this.myObjectList.Add(newMyObject(){First="Bob",Last="Jones"});this.myObjectList.Add(newMyObject(){First="Jane",Last="Doe"});}privatevoidButton_Click(objectsender,RoutedEventArgse){this.myObjectList[0].Last="BillyOBrian";}privatevoiddg_TargetUpdated(objectsender,DataTransferEventArgse){dg.Columns[0].Width=0;dg.UpdateLayout();dg.Columns[0].Width=newDataGridLength(1,DataGridLengthUnitType.Star);}}publicclassMyObject:INotifyPropertyChanged{privatestringfirstName;publicstringFirst{get{returnthis.firstName;}set{if(this.firstName!=value){this.firstName=value;NotifyPropertyChanged("第一");}}}私有字符串姓氏;publicstringLast{get{returnthis.lastName;}set{if(this.lastName!=value){this.lastName=value;NotifyPropertyChanged("最后");}}}publicMyObject(){}#region--INotifyPropertyChangedContract--公共事件PropertyChangedEventHandlerPropertyChanged;privatevoidNotifyPropertyChanged(Stringinfo){if(PropertyChanged!=null){PropertyChanged(this,newPropertyChangedEventArgs(info));}}#endregionINotifyPropertyChangedContract}}我的listview遇到了类似的问题,我在stackoverflow上的how-to-autosize-and-align-align-gridviewcolumn-data-in-wpf中找到了解决方案在我的例子中,它将此代码添加到列表视图绑定到的可观察集合的collectionchanged事件处理程序中:this.View作为GridView;foreach(GridViewColumncinview.Columns){if(double.IsNaN(c.Width)){c.Width=c.ActualWidth;}c.Width=double.NaN;它对我有用,尽管有时用户会注意到列上的“闪烁”。WPF只会在需要时将数据网格的列宽调整为自动,即:内容无法完全显示。因此,当内容的宽度缩小时,列不会调整大小,因为内容仍然完全可见。我能看到强制wpf重新计算列宽的唯一方法是将它们全部强制为0,然后在后面的代码中返回auto,抛出一个或两个updateLayout(),但这不是好的编程:-//基本上,在您后面的代码中:foreach(DataGridColumncindg.Columns)c.Width=0;//在此处更新DG的源代码foreach(DataGridColumncindg.Columns)c.Width=DataGridLength.Auto;你可能需要一个dg.UpdateLayout()或两个(更新并设置回自动)解决这个问题的一种方法是在样式设置中定义列的宽度属性并将该设置绑定到对象的属性。在您的ResourceDictionary中:ColumnWidth应该是对象的属性。现在,如果您从“更改”属性的设置器更新此属性(通过使用一些自定义算法,考虑字体等内容),并调用:RaisePropertyChanged("ColumnWidth");它应该更新您的列宽。publicintChange{get{returnm_change;}set{if(m_change!=value){m_change=value;ColumnWidth=WidthAlgo(numberOfCharacters);RaisePropertyChanged("更改");RaisePropertyChanged("列宽");你试过你经历过这个吗?以上是C#学习教程:DataGrid列宽不会自动更新所有共享内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
