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处理程序可让您在用户完成时进行处理.
您可以尝试扩展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。
希望这可以帮助!
归档时间: |
|
查看次数: |
8357 次 |
最近记录: |