我在我正在处理的其中一个应用程序中使用WPF Toolkit Datagrid。我想要的是将列宽和displayindex存储为用户首选项。我已经获得了list displayindex但是为了调整大小,我在datagrid上找不到任何事件,这会在列大小更改后触发。
我已经尝试过“SizeChanged”事件,我猜这个事件只是在最初计算大小时被触发,而且对于整个数据网格也是如此,而不是针对各个列。
任何替代解决方案或者是否有人知道该事件?
答案 0 :(得分:10)
取自......:
http://forums.silverlight.net/post/602788.aspx
载入后:
PropertyDescriptor pd = DependencyPropertyDescriptor
.FromProperty(DataGridColumn.ActualWidthProperty,
typeof(DataGridColumn));
foreach (DataGridColumn column in Columns) {
//Add a listener for this column's width
pd.AddValueChanged(column,
new EventHandler(ColumnWidthPropertyChanged));
}
2种方法:
private bool _columnWidthChanging;
private void ColumnWidthPropertyChanged(object sender, EventArgs e)
{
// listen for when the mouse is released
_columnWidthChanging = true;
if (sender != null)
Mouse.AddPreviewMouseUpHandler(this, BaseDataGrid_MouseLeftButtonUp);
}
void BaseDataGrid_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
if (_columnWidthChanging) {
_columnWidthChanging = false;
// save settings, etc
}
}
当用户拖动宽度时,ColumnWidthPropertyChanged会不断触发。添加PreviewMouseUp处理程序可让您在用户完成时进行处理。
答案 1 :(得分:1)
LayoutUpdated?
我在Silverlight工作,网格每秒都会反弹/刷新。
我正在使用LayoutUpdated方法,该方法会针对每个布局更新事件触发。
您可以保留列宽的字典并检查增量。然后你就会知道哪些列已经改变了。
foreach (DataGridColumn column in dataGrid1.Columns)
{
// check for changes...
// save the column.Width property to a dictionary...
}
答案 2 :(得分:0)
您可以尝试扩展DataGrid
,然后实施NotifyPropertyChange
事件。像这样:
class MyDataGrid : DataGrid, INotifyPropertyChanged
{
private DataGridLength _columnWidth;
public DataGridLength ColumnWidth
{
get { return _columnWidth; }
set
{
_columnWidth = value;
NotifyPropertyChanged("ColumnWidth");
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(String propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
}
从那里,您可以向处理程序添加一个delagate,以执行您想要的任何操作。类似的东西:
MyDataGrid dataGrid;
//init grid, do stuff
dataGrid.PropertyChanged += new PropertyChangedEventHandler(ColumnWidthChanged);
//ColumnWidthChanged will be a method you define
现在你有了delagate,你可以定义当列宽改变时你想要发生的事情:
private void ColumnWidthChanged(object sender, PropertyChangedEventArgs args)
{
if(args.PropertyName.Equals("ColumnWidth"))
{
//Do stuff now that the width is changed
}
}
您会注意到我正在检查哪个属性已更改。我设置它的方式是,您可以扩展其他属性并为其更改创建处理程序。如果您想要多个处理程序,最好使用DataGridPropertyChanged
方法来切换哪个属性已更改。然后,它会为每个被更改的属性调用适当的方法(例如ColumnWidthChanged
)。这样,您不必检查每个处理程序只修改一个属性。
您没有指定语言,因此我将其重新标记为C#。但是,如果您正在使用它,那么转换到VB应该很简单。
希望这有帮助!
答案 3 :(得分:0)
我假设您要保存列宽,以便下次启动应用程序时,使用相同的列宽来生成数据网格。
如果是这种情况,那么另一种方法是在应用程序关闭时保存列宽(和索引),这也比每次调整列大小时保存宽度更有效。
根据应用程序的结构,这样的事情应该有效......
private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
foreach (DataGridColumn column in dataGrid1.Columns)
{
// save the column.Width property to a user setting/file/registry/etc...
// optionally save the displayindex as well...
}
}