WPF Toolkit DataGrid列调整大小事件

Pra*_*vin 13 .net c# wpf datagrid wpftoolkit

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

J..*_*... 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));
        }
Run Code Online (Sandbox Code Playgroud)

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

        }
    }
Run Code Online (Sandbox Code Playgroud)

当用户拖动宽度时,ColumnWidthPropertyChanged会不断触发.添加PreviewMouseUp处理程序可让您在用户完成时进行处理.


Cha*_*dia 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));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

从那里,您可以向处理程序添加一个延迟来执行您想要它执行的任何操作。就像是:

MyDataGrid dataGrid;
//init grid, do stuff

dataGrid.PropertyChanged += new PropertyChangedEventHandler(ColumnWidthChanged);
//ColumnWidthChanged will be a method you define
Run Code Online (Sandbox Code Playgroud)

现在您已经有了延迟,您可以定义当列宽更改时您想要发生的情况:

private void ColumnWidthChanged(object sender, PropertyChangedEventArgs args)
{
    if(args.PropertyName.Equals("ColumnWidth"))
    {
        //Do stuff now that the width is changed
    }
}
Run Code Online (Sandbox Code Playgroud)

您会注意到我正在检查哪个属性已更改。我设置它的方式是这样的,您可以扩展其他属性并为它们的更改创建处理程序。如果您想要多个处理程序,最好创建一种DataGridPropertyChanged方法来切换更改的属性。ColumnWidthChanged然后,它会为每个发生更改的属性调用适当的方法(例如)。这样,您就不必检查每个处理程序是否只修改一个属性。

您没有指定语言,所以我将其重新标记为 C#。但是,如果您正在使用 VB,那么它应该足够简单,可以转换为 VB。

希望这可以帮助!