Laden...

[gelöst]DataGrid RowDetails werden nicht angezeigt

Erstellt von Ahrimaan vor 12 Jahren Letzter Beitrag vor 12 Jahren 2.366 Views
A
Ahrimaan Themenstarter:in
350 Beiträge seit 2010
vor 12 Jahren
[gelöst]DataGrid RowDetails werden nicht angezeigt

Hallo zusammen,
ich habe ein Problem mit einer View und dem Binding :

<UserControl x:Class="RAE.Client.View.ShowTaskOverviewView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:c="clr-namespace:Microsoft.Windows.Controls;assembly=WPFToolkit" mc:Ignorable="d" 
             d:DesignHeight="360" d:DesignWidth="797">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="80*"/>
            <ColumnDefinition Width="180"/>
        </Grid.ColumnDefinitions>
        <Expander Grid.Column="2" ExpandDirection="Down" Header="Suchoptionen">
            <Expander.Content>
                <Grid>
                    
                </Grid>
            </Expander.Content>
        </Expander>
        <c:DataGrid Grid.Column="0"  Grid.Row="0" ItemsSource="{Binding Persons}" AlternatingRowBackground="Aqua" CanUserReorderColumns="True" CanUserSortColumns="True"
                    CanUserResizeColumns="True" IsReadOnly="True" SelectedItem="{Binding CurrentItem}" ColumnHeaderStyle="{StaticResource ResourceKey=EmployeeGridColumnHeader}" 
                    CellStyle="{StaticResource ResourceKey=EmployeeGridCellStyle}">
            <c:DataGrid.RowDetailsTemplate>
                <HierarchicalDataTemplate ItemsSource="{Binding Path=Tasks}">
                    <Grid>
                         <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="30"/>
                            <ColumnDefinition Width="*"/>
                        </Grid.ColumnDefinitions>
                        <c:DataGrid Grid.Column="1">
                            <c:DataGrid.Columns>
                                <c:DataGridTemplateColumn Header="Name">
                                    <c:DataGridTemplateColumn.CellTemplate>
                                        <DataTemplate>
                                            <TextBlock Text="{Binding Name}"/>
                                        </DataTemplate>
                                    </c:DataGridTemplateColumn.CellTemplate>
                                </c:DataGridTemplateColumn>
                                <c:DataGridTemplateColumn Header="Erstellt Am">
                                    <c:DataGridTemplateColumn.CellTemplate>
                                        <DataTemplate>
                                            <TextBlock Text="{Binding CreateDate}"/>
                                        </DataTemplate>
                                    </c:DataGridTemplateColumn.CellTemplate>
                                </c:DataGridTemplateColumn>
                                <c:DataGridTemplateColumn Header="Erstellt Von">
                                    <c:DataGridTemplateColumn.CellTemplate>
                                        <DataTemplate>
                                            <TextBlock Text="{Binding CreatedFrom,Path=Name}"/>
                                        </DataTemplate>
                                    </c:DataGridTemplateColumn.CellTemplate>
                                </c:DataGridTemplateColumn>
                                <c:DataGridTemplateColumn Header="Geschlossen von">
                                    <c:DataGridTemplateColumn.CellTemplate>
                                        <DataTemplate>
                                            <TextBlock Text="{Binding ClosedBy,Path=Name}"/>
                                        </DataTemplate>
                                    </c:DataGridTemplateColumn.CellTemplate>
                                </c:DataGridTemplateColumn>
                                <c:DataGridTemplateColumn Header="Geschlossen am">
                                    <c:DataGridTemplateColumn.CellTemplate>
                                        <DataTemplate>
                                            <TextBlock Text="{Binding ClosedDate}"/>
                                        </DataTemplate>
                                    </c:DataGridTemplateColumn.CellTemplate>
                                </c:DataGridTemplateColumn>
                            </c:DataGrid.Columns>
                        </c:DataGrid>
                    </Grid>
                    
                </HierarchicalDataTemplate>
            </c:DataGrid.RowDetailsTemplate>
            <c:DataGrid.Columns>

                <c:DataGridTemplateColumn Header="ID" Visibility="Hidden">
                    <c:DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding Path=ID}" />
                        </DataTemplate>
                    </c:DataGridTemplateColumn.CellTemplate>

                </c:DataGridTemplateColumn>

                <c:DataGridTemplateColumn Header="Nachname" Width="150">
                    <c:DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding Path=Nachname}" TextAlignment="Left"  VerticalAlignment="Center" FontFamily="Courier New"/>
                        </DataTemplate>
                    </c:DataGridTemplateColumn.CellTemplate>
                </c:DataGridTemplateColumn>

                <c:DataGridTemplateColumn Header="Vorname" Width="150">
                    <c:DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding Path=Vorname}" TextAlignment="Left" VerticalAlignment="Center" FontFamily="Courier New"/>
                        </DataTemplate>
                    </c:DataGridTemplateColumn.CellTemplate>
                </c:DataGridTemplateColumn>

                <c:DataGridTemplateColumn Header="Personalnummer" Width="100">
                    <c:DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding Path=PersonalNummer}" TextAlignment="Left" VerticalAlignment="Center" FontFamily="Courier New"/>
                        </DataTemplate>
                    </c:DataGridTemplateColumn.CellTemplate>
                </c:DataGridTemplateColumn>
            </c:DataGrid.Columns>
        </c:DataGrid>
    </Grid>
</UserControl>

Und das ViewModel:

using System.Linq;
using RAE.Client.Extensions;
using RAE.Client.Model;
using RAE.Client.Session;
using RAE.Data.Models;
using WpfBase;

namespace RAE.Client.ViewModel
{
    public class ShowTaskOverviewViewModel:BaseWorkspaceViewModel
    {
        public ShowTaskOverviewViewModel(int windowId) : base(windowId)
        {         
            if (DataManager.IsAdmin)
            {
                DataManager.Repository.GetAllEmployesCompleted += (s, e) =>
                {
                    Persons = new ThreadSafeObservableCollection<Model.EmployeeModel>();
                    if(e.Employees != null)
                        e.Employees.ForEach(p => Persons.Add(p.ToModel()));
                };
                DataManager.Repository.GetAllEmployeesAsync();
            }
            else
            {
                DataManager.Repository.GetAllEmployesByEmployeeCompleted += (s, e) =>
                {
                    Persons = new ThreadSafeObservableCollection<Model.EmployeeModel>();
                    if (e.Employees != null)
                        e.Employees.ForEach(p => Persons.Add(p.ToModel()));
                };
                DataManager.Repository.GetAllEmployeesByEmployeeAsync(DataManager.CurrentUser);
            }
            this.DisplayName = "Aufgabenübersicht";
            Tasks = new ThreadSafeObservableCollection<RAETask>();
        }

        public ShowTaskOverviewViewModel(int windowId,Employee emp)
            : base(windowId)
        {
            _persons = new ThreadSafeObservableCollection<Model.EmployeeModel>();
            this.DisplayName = "Aufgabenübersicht";
        }

        private EmployeeModel _currentItem;
        public EmployeeModel CurrentItem
        {
            get { return _currentItem; }
            set { _currentItem = value;FillTaskForEmployee(); OnPropertyChanged(() => CurrentItem); }
        }

        private ThreadSafeObservableCollection<Model.EmployeeModel> _persons;
        public ThreadSafeObservableCollection<Model.EmployeeModel> Persons
        {
            get { return _persons; }
            set { _persons = value;OnPropertyChanged(() => Persons); }
        }

        private ThreadSafeObservableCollection<RAETask> _tasks;
        public ThreadSafeObservableCollection<RAETask> Tasks
        {
            get { return _tasks; }
            set { _tasks = value;OnPropertyChanged(() => Tasks); }
        }

        private void FillTaskForEmployee()
        {
            Tasks.Clear();
            _currentItem.Tasks.ToList().ForEach(p => Tasks.Add(p));
            OnPropertyChanged(() => Tasks);
        }
    }
}

Wenn ich auf eine Row klicke erscheinen zwar die RowDetails aber nur die Header.
Es werden keine Daten angezeigt. Die Namen der Propertys passen aber alle.
Sieht jmd auf den ersten Blick, wo der Fehler liegt ?

Grüße

R
100 Beiträge seit 2009
vor 12 Jahren

@Ahrimaan: Ich denke "Tasks" muss ein Property von "Person" sein. DataGrid lädt jedes Person in eine Zeile und "RowDetails" bindet noch mal die Eigenschaften des "Person" in SubDataGrid. "Tasks" ist nicht Eigenschaft des "Person" daher SubDataGrid ist leer.

A
Ahrimaan Themenstarter:in
350 Beiträge seit 2010
vor 12 Jahren

Hi, Tasks ist eine Property von Person ...

582 Beiträge seit 2008
vor 12 Jahren

Hallo,

kann es sein das der ausdruck Path fehlt, also statt
{Binding CreateDate}
das brachte bei mir korrekte Ergebnisse.
{Binding Path=CreateDate}

du kannst auch PresentationTraceSources.TraceLevel="High" noch einfügen, dann bekommt man ggf mehr debuginformationen.

Gruß dat Tala

A
Ahrimaan Themenstarter:in
350 Beiträge seit 2010
vor 12 Jahren

Hi,

ich habe den Fehler gefunden:
Ich muss dem DataGrid in dem Template die ItemSource geben nicht dem Template selber.
Dadurch ist es auch unnötig ein HierachicalDataTemplate zu nutzen, das macht das DataGrid bereits.
Es Reicht also ein normales DataTemplate 😃

<c:DataGrid.RowDetailsTemplate>
                <DataTemplate >
                    <Grid>
                         <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="30"/>
                            <ColumnDefinition Width="*"/>
                        </Grid.ColumnDefinitions>
                        <c:DataGrid Grid.Column="1" ItemsSource="{Binding Path=Tasks}" AutoGenerateColumns="False">
                            <c:DataGrid.Columns>
                                <c:DataGridTemplateColumn Header="Name">
                                    <c:DataGridTemplateColumn.CellTemplate>
                                        <DataTemplate>
                                            <TextBlock Text="{Binding Path=Name}"/>
                                        </DataTemplate>
                                    </c:DataGridTemplateColumn.CellTemplate>
                                </c:DataGridTemplateColumn>
                                <c:DataGridTemplateColumn Header="Erstellt Am">
                                    <c:DataGridTemplateColumn.CellTemplate>
                                        <DataTemplate>
                                            <TextBlock Text="{Binding CreateDate}"/>
                                        </DataTemplate>
                                    </c:DataGridTemplateColumn.CellTemplate>
                                </c:DataGridTemplateColumn>
                                <c:DataGridTemplateColumn Header="Erstellt Von">
                                    <c:DataGridTemplateColumn.CellTemplate>
                                        <DataTemplate>
                                            <TextBlock Text="{Binding CreatedFrom,Path=Name}"/>
                                        </DataTemplate>
                                    </c:DataGridTemplateColumn.CellTemplate>
                                </c:DataGridTemplateColumn>
                                <c:DataGridTemplateColumn Header="Geschlossen von">
                                    <c:DataGridTemplateColumn.CellTemplate>
                                        <DataTemplate>
                                            <TextBlock Text="{Binding ClosedBy,Path=Name}"/>
                                        </DataTemplate>
                                    </c:DataGridTemplateColumn.CellTemplate>
                                </c:DataGridTemplateColumn>
                                <c:DataGridTemplateColumn Header="Geschlossen am">
                                    <c:DataGridTemplateColumn.CellTemplate>
                                        <DataTemplate>
                                            <TextBlock Text="{Binding ClosedDate}"/>
                                        </DataTemplate>
                                    </c:DataGridTemplateColumn.CellTemplate>
                                </c:DataGridTemplateColumn>
                            </c:DataGrid.Columns>
                        </c:DataGrid>
                    </Grid>

                </DataTemplate>
            </c:DataGrid.RowDetailsTemplate>