WPF - Привязка к текущему объекту из стиля заголовка группы

Я - что-то вроде новичка 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>
9
задан Andy T 27 January 2010 в 14:42
поделиться

2 ответа

Спасибо за ответ. Я очень ценю это и проверю, работает ли это.

Как бы то ни было, как выяснилось, после некоторых уловок я решил это, используя только 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>
19
ответ дан 4 December 2019 в 08:33
поделиться

настройки привязки зависят от типа свойства 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>
6
ответ дан 4 December 2019 в 08:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: