Я - что-то вроде новичка WPF, поэтому успокойтесь на мне;-)
Я пытаюсь создать сгруппированный DataGrid (версия инструментария WPF). Я успешно создал источник данных, сам DataGrid, необходимый CollectionViewSource и Стиль для заголовка группы (который использует расширитель).
Я хочу сгруппироваться свойством под названием 'Assign_To' и иметь соответствующее значение (значение, которое сгруппированные объекты совместно используют), обнаруживаются в заголовке. Однако я не могу разработать, как связать с текущей группой/объектом для возврата ее свойства Assign_To.
Самое близкое, которое я имею (показанный ниже) связывает с полным CollectionViewSource, который возвращает фиксированное значение для Assign_To. Каков был бы надлежащий способ связать с текущим объектом/группой для возврата правильного значения для 'Assign_To'?
Надежда кто-то может помочь. Спасибо!
Andy T.
Вот источник...
<Window DataContext="{Binding Source={StaticResource SampleDataSource}}"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:dg="http://schemas.microsoft.com/wpf/2008/toolkit"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
x:Class="DataGridTest.MainWindow"
x:Name="Window"
Title="MainWindow"
Width="640" Height="480" mc:Ignorable="d">
<Window.Resources>
<CollectionViewSource x:Key="CVS" Source="{Binding MyData}">
<CollectionViewSource.GroupDescriptions>
<PropertyGroupDescription PropertyName="Assign_To"/>
</CollectionViewSource.GroupDescriptions>
</CollectionViewSource>
<Style x:Key="GroupHeaderStyle" TargetType="{x:Type GroupItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type GroupItem}">
<Expander IsExpanded="True">
<Expander.Header>
<StackPanel Orientation="Horizontal">
<TextBlock Text="Assign To: "/>
<TextBlock Text="{Binding Source={StaticResource CVS}, Path=Assign_To}"/>
</StackPanel>
</Expander.Header>
<ItemsPresenter/>
</Expander>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Window.Resources>
<Grid x:Name="LayoutRoot">
<dg:DataGrid
ItemsSource="{Binding Source={StaticResource CVS}}"
SelectionUnit="CellOrRowHeader"
CanUserAddRows="False"
CanUserDeleteRows="False"
CanUserResizeRows="False">
<dg:DataGrid.GroupStyle>
<GroupStyle ContainerStyle="{StaticResource GroupHeaderStyle}">
<GroupStyle.Panel>
<ItemsPanelTemplate>
<dg:DataGridRowsPresenter/>
</ItemsPanelTemplate>
</GroupStyle.Panel>
</GroupStyle>
</dg:DataGrid.GroupStyle>
</dg:DataGrid>
</Grid>
</Window>
Спасибо за ответ. Я очень ценю это и проверю, работает ли это.
Как бы то ни было, как выяснилось, после некоторых уловок я решил это, используя только XAML. Чего мне не хватало, так это того факта, что каждый элемент, к которому привязан заголовок группы, является GroupItem и что DataContext по умолчанию для GroupItem - это CollectionViewGroup . В свою очередь, CollectionViewGroup имеет свойство Items , которое является коллекцией, и поэтому я могу получить значение Assign_To первого элемента в коллекции и использовать это в моем заголовке. Как это:
<Style x:Key="GroupHeaderStyle" TargetType="{x:Type GroupItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type GroupItem}">
<Expander IsExpanded="True">
<Expander.Header>
<StackPanel Orientation="Horizontal">
<TextBlock Text="Assign To: "/>
<TextBlock Text="{Binding Items[0].Assign_To}"/>
</StackPanel>
</Expander.Header>
<ItemsPresenter/>
</Expander>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
настройки привязки зависят от типа свойства Assign_To. Самыми простыми настройками, которые, вероятно, могли бы вам помочь, будут:
<TextBlock Text="Assign To: "/>
<TextBlock Text="{Binding Name}"/>
pls, проверьте, будет ли вам работать приведенный ниже пример; также эта ссылка WPF Toolkit DataGrid Part IV: TemplateColumns and Row Grouping может быть полезна для вас
code:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
var dataProvider = (CollectionViewSource)FindResource("CVS");
dataProvider.Source = Test.GetTests();
}
}
public class Test
{
public string Assign_To { get; set; }
public string Test0 { get; set; }
public int Test1 { get; set; }
public static List<Test> GetTests()
{
List<Test> tests = new List<Test>();
tests.Add(new Test { Assign_To = "a", Test0 = "aaaa", Test1 = 1 });
tests.Add(new Test { Assign_To = "a", Test0 = "bbbb", Test1 = 1 });
tests.Add(new Test { Assign_To = "b", Test0 = "cccc", Test1 = 2 });
return tests;
}
}
xaml:
<Window.Resources>
<CollectionViewSource x:Key="CVS" >
<CollectionViewSource.GroupDescriptions>
<PropertyGroupDescription PropertyName="Assign_To"/>
</CollectionViewSource.GroupDescriptions>
</CollectionViewSource>
<Style x:Key="GroupHeaderStyle" TargetType="{x:Type GroupItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type GroupItem}">
<Expander IsExpanded="True">
<Expander.Header>
<StackPanel Orientation="Horizontal">
<TextBlock Text="Assign To: "/>
<TextBlock Text="{Binding Name}"/>
</StackPanel>
</Expander.Header>
<ItemsPresenter />
</Expander>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Window.Resources>
<Grid>
<DataGrid
ItemsSource="{Binding Source={StaticResource CVS}}"
HorizontalScrollBarVisibility="Hidden" SelectionMode="Extended"
AutoGenerateColumns="False"
Name="dataGrid1">
<DataGrid.GroupStyle>
<GroupStyle ContainerStyle="{StaticResource GroupHeaderStyle}">
<GroupStyle.Panel>
<ItemsPanelTemplate>
<DataGridRowsPresenter/>
</ItemsPanelTemplate>
</GroupStyle.Panel>
</GroupStyle>
</DataGrid.GroupStyle>
<DataGrid.Columns>
<DataGridTextColumn Header="Test0" Binding="{Binding Path=Test0}" />
<DataGridTextColumn Header="Test1" Binding="{Binding Path=Test1}" />
</DataGrid.Columns>
</DataGrid>
</Grid>