none
Datagrid Speicherverbrauch wenn keine Höhenangabe RRS feed

  • Frage

  • Hallo

    Ich bin neu in WPF eingestiegen und komme mit ein paar grundlegenden Dingen noch nicht klar.

    Eines davon ist folgendes:

    Ich habe ein UserControl angelegt welches eine Datagrid beinhaltet. Gebunden ist diese mit einer Observable Collection.

     <Grid DataContext="{StaticResource vm}">
            <DataGrid ItemsSource="{Binding Events, UpdateSourceTrigger=PropertyChanged}"/>
     </Grid>

    Das UserControl wird wiederum über einen ContentPresenter in ein Grid eingebunden (als CurrentView).

     <Grid>
                <ContentPresenter x:Name="ContentArea"  Content="{Binding CurrentView}" />
     </Grid>

    Starte ich jetzt die Anwendung, steigt der Speicherverbrauch auf mehrere hundert MB an und das Laden der Daten dauert ewig.

    Begrenze ich jetzt die Höhe im ContentPresenter oder der Datagrid auf einen fixen Wert bspw. Height="300" bleibt der Speicherverbrauch gering und das Laden geht zackig.

    Binde ich die Höhe an das übergeordnete Element oder setze ich die Property "HorizontalAlignment" auf "Stretch" habe ich wieder das Speicherproblem.

    Habt ihr eine Idee woran das liegt?

    Beste Grüße

    D.

    Mittwoch, 13. Januar 2016 19:45

Antworten

  • Problem gelöst.

    Hab das Stackpanel durch eine Dockpanel ersetzt.

    <Window
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:WpfApplication4"
            xmlns:viewModel="clr-namespace:WpfApplication4.ViewModels"
            xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions" x:Class="WpfApplication4.MainWindow"
            mc:Ignorable="d"
             Name="host"
            Title="MainWindow" Height="350" Width="653">
    
        <Window.Resources>
            <viewModel:MainViewModel x:Key="mainViewModel"/>
            <viewModel:EventViewModel x:Key="eventViewModel"/>
            <viewModel:TestViewModel x:Key="testViewModel"/>
        </Window.Resources>
    
        <DockPanel DataContext="{StaticResource mainViewModel}" LastChildFill="True"  >
            <UniformGrid Rows="1" DockPanel.Dock="Top">
                <Button Content="Elements">
                    <i:Interaction.Triggers>
                        <i:EventTrigger EventName="Click">
                            <ei:CallMethodAction TargetObject="{Binding Mode=OneWay}" MethodName="ChangeToElementView"/>
                        </i:EventTrigger>
                    </i:Interaction.Triggers>
                </Button>
                <Button Content="Events" >
                    <i:Interaction.Triggers>
                        <i:EventTrigger EventName="Click">
                            <ei:CallMethodAction TargetObject="{Binding Mode=OneWay}" MethodName="ChangeToEventView"/>
                        </i:EventTrigger>
                    </i:Interaction.Triggers>
                </Button>
                <Button Content="Test" >
                    <i:Interaction.Triggers>
                        <i:EventTrigger EventName="Click">
                            <ei:CallMethodAction TargetObject="{Binding Mode=OneWay}" MethodName="ChangeToTestView"/>
                        </i:EventTrigger>
                    </i:Interaction.Triggers>
                </Button>
            </UniformGrid>
            <Grid DockPanel.Dock="Bottom">
                <ContentPresenter x:Name="ContentArea"  Content="{Binding CurrentView}" />
            </Grid>
        </DockPanel>
    
    </Window>
    

    Mittwoch, 13. Januar 2016 21:20

Alle Antworten

  • Hi,
    durch die Begrenzung werden vermutlich nur einige Daten abgerufen, wobei ohne Begrenzung erst einmal alle Daten geholt werden. Um das zu analysieren, müsste man das weitere Umfeld kennen, z.B. Art des Ladens der Daten.

    --
    Viele Grüsse
    Peter Fleischer (MVP, Partner)
    Meine Homepage mit Tipps und Tricks
    Kommas richtig setzen!
    Schüler sagen, Lehrer haben es gut.
    Schüler, sagen Lehrer, haben es gut

    Mittwoch, 13. Januar 2016 20:10
  • Hi

    Danke für deine Antwort.

    Die Daten dürften vollständig geladen werden (sieht zumindest lt. Scrollbar so aus). Geladen werden diese asynchron über "executeQuery" von einer SQL Datenbank in die ObservableCollection. Diese triggert über onpropertyChanged die DataGrid.

    Die Anzahl der Datensätze beträgt so um die 2000.

    Was mir jetzt auch aufgefallen ist, ist wenn die Höhe des ContentPresenters an das Property "ActualHeight" des Windows gebunden ist, funktioniert es aus Performance Sicht auch einwandfrei.

    <Window
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:WpfApplication4"
            xmlns:viewModel="clr-namespace:WpfApplication4.ViewModels"
            xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions" x:Class="WpfApplication4.MainWindow"
            mc:Ignorable="d"
            Name="host"
            Title="MainWindow" Height="350" Width="525">
    
        <Window.Resources>
            <viewModel:MainViewModel x:Key="mainViewModel"/>
            <viewModel:EventViewModel x:Key="eventViewModel"/>
            <viewModel:TestViewModel x:Key="testViewModel"/>
        </Window.Resources>
    
        <StackPanel DataContext="{StaticResource mainViewModel}" >
            <UniformGrid Rows="1">
                <Button Content="Elements">
                    <i:Interaction.Triggers>
                        <i:EventTrigger EventName="Click">
                            <ei:CallMethodAction TargetObject="{Binding Mode=OneWay}" MethodName="ChangeToElementView"/>
                        </i:EventTrigger>
                    </i:Interaction.Triggers>
                </Button>
                <Button Content="Events" >
                    <i:Interaction.Triggers>
                        <i:EventTrigger EventName="Click">
                            <ei:CallMethodAction TargetObject="{Binding Mode=OneWay}" MethodName="ChangeToEventView"/>
                        </i:EventTrigger>
                    </i:Interaction.Triggers>
                </Button>
                <Button Content="Test" >
                    <i:Interaction.Triggers>
                        <i:EventTrigger EventName="Click">
                            <ei:CallMethodAction TargetObject="{Binding Mode=OneWay}" MethodName="ChangeToTestView"/>
                        </i:EventTrigger>
                    </i:Interaction.Triggers>
                </Button>
            </UniformGrid>
            <Grid>
                <ContentPresenter x:Name="ContentArea"  Content="{Binding CurrentView}" Height="{Binding ElementName=host, Path=ActualHeight}" />
            </Grid>
        </StackPanel>
    
    </Window>
    Der Nachteil ist halt, dass auf Grund des Höhenunterschiedes des Windows zum ContentPresenter der untere Teil der DataGrid nicht mehr sichtbar ist.

    Mittwoch, 13. Januar 2016 20:47
  • Problem gelöst.

    Hab das Stackpanel durch eine Dockpanel ersetzt.

    <Window
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:WpfApplication4"
            xmlns:viewModel="clr-namespace:WpfApplication4.ViewModels"
            xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions" x:Class="WpfApplication4.MainWindow"
            mc:Ignorable="d"
             Name="host"
            Title="MainWindow" Height="350" Width="653">
    
        <Window.Resources>
            <viewModel:MainViewModel x:Key="mainViewModel"/>
            <viewModel:EventViewModel x:Key="eventViewModel"/>
            <viewModel:TestViewModel x:Key="testViewModel"/>
        </Window.Resources>
    
        <DockPanel DataContext="{StaticResource mainViewModel}" LastChildFill="True"  >
            <UniformGrid Rows="1" DockPanel.Dock="Top">
                <Button Content="Elements">
                    <i:Interaction.Triggers>
                        <i:EventTrigger EventName="Click">
                            <ei:CallMethodAction TargetObject="{Binding Mode=OneWay}" MethodName="ChangeToElementView"/>
                        </i:EventTrigger>
                    </i:Interaction.Triggers>
                </Button>
                <Button Content="Events" >
                    <i:Interaction.Triggers>
                        <i:EventTrigger EventName="Click">
                            <ei:CallMethodAction TargetObject="{Binding Mode=OneWay}" MethodName="ChangeToEventView"/>
                        </i:EventTrigger>
                    </i:Interaction.Triggers>
                </Button>
                <Button Content="Test" >
                    <i:Interaction.Triggers>
                        <i:EventTrigger EventName="Click">
                            <ei:CallMethodAction TargetObject="{Binding Mode=OneWay}" MethodName="ChangeToTestView"/>
                        </i:EventTrigger>
                    </i:Interaction.Triggers>
                </Button>
            </UniformGrid>
            <Grid DockPanel.Dock="Bottom">
                <ContentPresenter x:Name="ContentArea"  Content="{Binding CurrentView}" />
            </Grid>
        </DockPanel>
    
    </Window>
    

    Mittwoch, 13. Januar 2016 21:20
  • Hi,
    logisch, dass diese Umgehungslösung andere Ergebnisse bringt, aber nicht für die eigentliche Ursache verantwortlich ist. Im StackPanel werden erst einmal alle geladenen Daten aufbereitet, um dann entsprechend Lage des ScrollVieers nur Teile davon zu sehen. Beim DockPanel dagegen werden nur die Daten "gerendert", die auch wirklich angezeigt werden.

    --
    Viele Grüsse
    Peter Fleischer (MVP, Partner)
    Meine Homepage mit Tipps und Tricks
    Kommas richtig setzen!
    Schüler sagen, Lehrer haben es gut.
    Schüler, sagen Lehrer, haben es gut

    Mittwoch, 13. Januar 2016 22:16