Я использую ListView с GridView. Есть ли событие изменения размера GridViewColumn?
WPF: событие изменения размера GridViewColumn
Ответы (5)
Посмотрите детали MSDN DridViewColumn. Похоже, такого события нет, возможно, требуется какой-то обходной путь, хотя я не уверен. смотрите здесь
Надеюсь, поможет.
Вместо этого я обработаю событие PropertyChanged. Событие PropertyChanged не видно в IntelliSense Visual Studio, но его можно обмануть :)
GridViewColumn column = ...
((System.ComponentModel.INotifyPropertyChanged)column).PropertyChanged += (sender, e) =>
{
if (e.PropertyName == "ActualWidth")
{
//do something here...
}
};
Хотя GridViewColumn не имеет события Resize, вы можете выполнить привязку к свойству ColumnWidth.
Вы можете проверить это с помощью приведенного ниже примера XAML — для этого примера не требуется дополнительный код. Он привязывается только в одном направлении, от ширины столбца к текстовому полю, и при изменении размера вы увидите, что текстовое поле сразу же обновляется с шириной столбца.
(Это всего лишь простой пример; если вы хотите изменить размер в коде, я бы создал класс со свойством Width, чтобы привязка работала в обоих направлениях).
<StackPanel>
<ListView>
<ListView.View>
<GridView>
<GridViewColumn Width="{Binding ElementName=tbWidth1, Path=Text, Mode=OneWayToSource}" />
<GridViewColumn Width="{Binding ElementName=tbWidth2, Path=Text, Mode=OneWayToSource}" />
</GridView>
</ListView.View>
<ListViewItem>Item 1</ListViewItem>
<ListViewItem>Item 2</ListViewItem>
</ListView>
<TextBox Name="tbWidth1" />
<TextBox Name="tbWidth2" />
</StackPanel>
private void ListView_Loaded( object sender, RoutedEventArgs e )
{
// Add the handler to know when resizing a column is done
((ListView)sender).AddHandler( Thumb.DragCompletedEvent, new DragCompletedEventHandler( ListViewHeader_DragCompleted ), true );
}
private void ListViewHeader_DragCompleted( object sender, System.Windows.Controls.Primitives.DragCompletedEventArgs e )
{
ListView lv = sender as ListView;
... code handing the resize goes here ...
}
XAML:
<ListView Loaded="ListView_Loaded">
Другой подход: вы можете прикрепить обработчик события изменения к свойству GridViewColumn Width:
PropertyDescriptor pd = DependencyPropertyDescriptor.FromProperty(
GridViewColumn.WidthProperty, typeof(GridViewColumn));
GridView gv = (GridView)myListView.View;
foreach (GridViewColumn col in gv.Columns) {
pd.AddValueChanged(col, ColumnWidthChanged);
}
...
private void ColumnWidthChanged(object sender, EventArgs e) { ... }
(На основе ответа здесь для аналогичного вопроса о DataGrid.)