Событие изменения размера столбца DataGrid набора инструментов WPF - PullRequest
13 голосов
/ 25 октября 2010

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

Ответы [ 4 ]

10 голосов
/ 09 декабря 2011

взято из ...:

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 голос
/ 03 октября 2012

LayoutUpdated?

Я работаю в Silverlight, и сетка восстанавливается / обновляется каждую секунду.

Я использую метод LayoutUpdated, который запускается для каждого события обновления макета.

Вы можете хранить словарь ширины столбцов и проверять наличие дельт.Тогда вы узнаете, какие столбцы изменились.

foreach (DataGridColumn column in dataGrid1.Columns)
{
    // check for changes...
    // save the column.Width property to a dictionary...
}
0 голосов
/ 05 декабря 2011

Я предполагаю, что вы хотите сохранить ширину столбцов, чтобы при следующем запуске приложения эти же ширины столбцов использовались для создания сетки данных.

Если это так, то альтернативой является сохранениеширины столбцов (и индексы) при закрытии приложения, что также было бы более эффективно, чем сохранение ширины при каждом изменении размера столбца.

В зависимости от структуры вашего приложения, что-то подобное должно работать ...

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...
  }
} 
0 голосов
/ 04 августа 2011

Вы можете попробовать расширить 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));
        }
    }
}

Оттуда вы можете добавить отсрочку к обработчику, чтобы делать все, что вы хотите, чтобы он делал. Что-то вроде:

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

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

...