Подтвердить что ты не робот

Событие изменения размера столбца WPF Toolkit DataGrid

Я использую WPF Toolkit Datagrid в одном из приложений, над которыми я работаю. Я хочу сохранить ширину столбца и displayindex в качестве предпочтения пользователя. Я получил его для display display, но для изменения размера я не смог найти какое-либо событие в datagrid, которое будет запускаться после изменения размера столбца. Я пробовал событие "SizeChanged", которое, как мне кажется, только уволено, когда оно первоначально вычисляет размер, и это тоже относится к целому datagrid, а не к отдельным столбцам.
 Любое альтернативное решение или если кто-нибудь знает о событии?

4b9b3361

Ответ 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, если это то, что вы используете.

Надеюсь, это поможет!