Приятный сюрприз после отпуска, с выходом NET 3.5 SP1 появилась возможность использовать WPF-ный DataGrid.
Насколько мне известно, Выход SP1 состоялся 11 августа, а 12-го выложили WPFToolkit.dll, правда ещё только CTP. Но MS божится, что скоро будет окончательный релиз.
Сегодня оторвался от дел, нетерпелось пощупать долгожданный всеми контрол. Времени было немного, но в основном я остался доволен.
Далее приводится короткое описание использования этого контрола полученное мною методом тыка
.
1. Скачиваем DLL.
2. Разархивируем и суём куда-нибудь.
3. Создаем тестовое WPF приложение (обязательно SP1).
4. В Solution Explorer -> References добавляем ссылку на либу.
5. Создаём источник для DataGrid:
public
class MyClass
{
public string Field1 { get; set; }
public string Field2 { get; set; }
public string Field3 { get; set; }
}
public class MyClasses : System.Collections.ObjectModel.ObservableCollection<MyClass>
{
}
6. Создаём простенькую разметку:
<
Window x:Class="WpfApplicationSP1test.Window1"
xmlns=http://schemas.microsoft.com/winfx/2006/xaml/presentation
xmlns:x=http://schemas.microsoft.com/winfx/2006/xaml
xmlns:l="clr-namespace:WpfApplicationSP1test"
xmlns:dg="clr-namespace:Microsoft.Windows.Controls;assembly=WpfToolkit"
Title="Тестовое приложение SP1" Height="275" Width="474" WindowStartupLocation="CenterScreen" Name="window1">
<Window.Resources>
<l:MyClasses x:Key="dgSource"/>
</Window.Resources>
<DockPanel>
<ToolBar DockPanel.Dock="Top">
<Button Name="Load" Content="Загрузить" Click="Load_Click"/>
<Button Name="Save" Content="‘Сохранить" Click="Save_Click"/>
<Separator Margin="4,0,4,0"/>
<Button Name="Add" Content="Добавить" Click="Add_Click"/>
</ToolBar>
<dg:DataGrid DockPanel.Dock="Top" Name="dataGrid" DataContext="{DynamicResource dgSource}" ItemsSource="{Binding}" AutoGenerateColumns="True"/>
</DockPanel>
</Window>
7. Пишем обработчики событий в отделённом коде:
private void Load_Click(object sender, RoutedEventArgs e)
{
var fs = new System.IO.FileStream("dgSource.XAML", System.IO.FileMode.Open);
var dgSource = System.Windows.Markup.XamlReader.Load(fs) as MyClasses;
if (dgSource == null) return;
window1.Resources.Remove("dgSource");
window1.Resources.Add("dgSource", dgSource);
}
private void Save_Click(object sender, RoutedEventArgs e)
{
var dgSource = window1.FindResource("dgSource") as MyClasses;
if (dgSource == null) return;
var fs = new System.IO.FileStream("dgSource.XAML", System.IO.FileMode.Create);
System.Windows.Markup.XamlWriter.Save(dgSource, fs);
fs.Close();
}
private void Add_Click(object sender, RoutedEventArgs e)
{
var dgSource = dataGrid.ItemsSource as MyClasses;
if (dgSource == null) return;
dgSource.Add(new MyClass());
}
8. Компилируем и запускаем на выполнение.
Что понравилось:
1. С источниками данных работает также, как и ListBox (может быть есть и другие варианты, пока ещё не смотрел).
2. Без лишних телодвижений работает сортировка столбцов (в том числе и по нескольким столбцам при нажатом Shift).
3. Нормально работает прямой и обратный (на источник) биндинг, поэтому легко управлять данными, манипулируя непосредственно источником. Не требуются всякие там AcceptText...
Не понравилось:
Удаление строк клавишей <Del>. По моему мнению это не очень удобно и может привести к путанице при редактировании ячеек. К примеру, пользователь при вводе данных ошибся, при помощи <Del> что-то удалил, нажал <Enter>, а потом решил что-то доудалить и ещё раз нажал <Del>, после чего исчезнет вся редактируемая строка. Надеюсь, что это можно как-то переопределить, попробую поколдовать с туннелированными событиями.
Но в целом впечатление очень даже приятное, планирую в ближайшее время серьёзно заняться изучением этого контрола. Если сообщество проявит интерес, кое-что могу запостить и сюда.
PS. Если хотите проинициализировать столбцы вручную, нужно перевести AutoGenerateColumns="False" и прописать:
<dg:DataGrid DockPanel.Dock="Top" Name="dataGrid" DataContext="{DynamicResource dgSource}" ItemsSource="{Binding}" AutoGenerateColumns="False">
<dg:DataGrid.Columns>
<dg:DataGridTextColumn Header="Первое поле" DataFieldBinding="{Binding Field1}"/>
<dg:DataGridTextColumn Header="Второе поле" DataFieldBinding="{Binding Field2}"/>
<dg:DataGridTextColumn Header="Третье поле" DataFieldBinding="{Binding Field3}"/>
</dg:DataGrid.Columns>
</dg:DataGrid>
PS. Внимание всем, кто до сих пор просматривает этот блог!
Вышел октябрьский релиз WPFToolkit. В отличие от CTP, релиз инсталлируется через MSI. После инсталляции в тулбоксе VS 2008 SP1 появляется вкладка WPF Toolkit.