WPF Toolkit DataGrid列调整大小事件

时间:2010-10-25 15:59:22

标签: c# .net wpf datagrid wpftoolkit

我在我正在处理的其中一个应用程序中使用WPF Toolkit Datagrid。我想要的是将列宽和displayindex存储为用户首选项。我已经获得了list displayindex但是为了调整大小,我在datagrid上找不到任何事件,这会在列大小更改后触发。 我已经尝试过“SizeChanged”事件,我猜这个事件只是在最初计算大小时被触发,而且对于整个数据网格也是如此,而不是针对各个列。
 任何替代解决方案或者是否有人知道该事件?

4 个答案:

答案 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...
  }
}