Я использую WPF Toolkit Datagrid в одном из приложений, над которыми я работаю. Я хочу сохранить ширину столбца и displayindex в качестве предпочтения пользователя. Я получил его для display display, но для изменения размера я не смог найти какое-либо событие в datagrid, которое будет запускаться после изменения размера столбца.
Я пробовал событие "SizeChanged", которое, как мне кажется, только уволено, когда оно первоначально вычисляет размер, и это тоже относится к целому datagrid, а не к отдельным столбцам.
Любое альтернативное решение или если кто-нибудь знает о событии?
Событие изменения размера столбца WPF Toolkit DataGrid
Ответ 1
взято из...:
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 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 позволяет вам обрабатывать, когда пользователь выполнен.
Ответ 2
LayoutUpdated?
Я работаю в Silverlight, и сетка восстанавливается/обновляется каждую секунду.
Я использую метод LayoutUpdated, который запускается для каждого события обновления макета.
Вы можете сохранить словарь ширины столбцов и проверить дельта. Затем вы должны знать, какие столбцы были изменены.
foreach (DataGridColumn column in dataGrid1.Columns)
{
// check for changes...
// save the column.Width property to a dictionary...
}
Ответ 3
Я предполагаю, что вы хотите сохранить ширину столбцов, чтобы при следующем запуске приложения те же ширины столбцов использовались для создания сетки данных.
Если в этом случае альтернативой является сохранение ширины столбцов (и индексов) при закрытии приложения, что также будет более эффективным, чем сохранение ширины при каждом изменении размера столбца.
В зависимости от того, как ваше приложение структурировано, что-то вроде этого должно работать...
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...
}
}
Ответ 4
Вы можете попробовать расширить 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
) для каждого свойства, которое будет изменено. Таким образом, вам не нужно проверять, что каждый обработчик изменяет только одно свойство.
Вы не указали язык, поэтому я перемаркировал его на С#. Однако, это должно быть достаточно простым, чтобы транспонировать в VB, если это то, что вы используете.
Надеюсь, это поможет!