Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Binding im Style (TextBlock Height an Grid.Row.ActualHeigth)?
MarioR
myCSharp.de - Member



Dabei seit:
Beiträge: 3

Themenstarter:

Binding im Style (TextBlock Height an Grid.Row.ActualHeigth)?

beantworten | zitieren | melden

Hallo,

ich hab ein Usercontrol mit einer Listbox in einem Grid.
Nun möchte ich, dass sich die "ItemHeigt" der Listbox nach der
aktuellen RowHeight des Grid richtet.
Das sollte doch bestimmt über Binding möglich sein, oder?

<UserControl x:Class="Usercontrols.PageOpenMessSchicht"    
       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" 
             mc:Ignorable="d" 
             d:DesignHeight="287" d:DesignWidth="230" Name="pgOpenMessSchicht" FontSize="12">
    <Grid Name="grdPgOpentMessSchight">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="86*" />
            <ColumnDefinition Width="144*" />
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition >>>>{Hier an die ActualHeight}<<<</>
            <RowDefinition />
            <RowDefinition />
            <RowDefinition />
            <RowDefinition />
            <RowDefinition />
            <RowDefinition />
            <RowDefinition />
            <RowDefinition />
            <RowDefinition />
        </Grid.RowDefinitions>
        <Button Content="OK" Grid.Row="9" Grid.Column="1" HorizontalAlignment="Stretch" Margin="2" Name="btnOK" VerticalAlignment="Stretch" Click="btnOK_Click" />
        <Button Content="ABBR" Grid.Row="9" Grid.Column="0" HorizontalAlignment="Stretch" Margin="2" Name="btnCancel" VerticalAlignment="Stretch" Click="btnCancel_Click" />
        <ListBox Grid.Row="0"  Grid.Column="0" Grid.RowSpan="9" Grid.ColumnSpan="2" HorizontalAlignment="Stretch" Margin="2" Name="lbMessSchichten" VerticalAlignment="Stretch" MouseDoubleClick="lbMessSchichten_MouseDoubleClick" ItemsSource="{Binding MessSchichten}">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Value}" Height="{Binding >>>???<<<}"/>
                </DataTemplate>
            </ListBox.ItemTemplate>    
         </ListBox>
    </Grid>
</UserControl>

lg Mario
private Nachricht | Beiträge des Benutzers
zero_x
myCSharp.de - Member

Avatar #avatar-2567.gif


Dabei seit:
Beiträge: 1.044
Herkunft: Koblenz

beantworten | zitieren | melden

Hallo MarioR,

das sind die absoluten Grundlagen von WPF. Ich würde dir raten, dich in das Thema einzulesen, bevor du hier im Forum fragst. So hart wie es auch klingen mag - du kannst lesen, vorkauen brauchen wir es nicht. Einen guten Einstieg findest du hier Data Binding Overview.

zero_x
zero_x | myCSharp.de - gemeinsam mehr erreichen

Für längere Zeit inaktiv.
private Nachricht | Beiträge des Benutzers
MarioR
myCSharp.de - Member



Dabei seit:
Beiträge: 3

Themenstarter:

beantworten | zitieren | melden

... Basics sind ja auch wichtig ...

nur hierbei hab ich ein Problem

bei:

    <Grid Name="grdPgOpentMessSchight">
...
        <Grid.RowDefinitions>
            <RowDefinition Name="rowDefinitionHeight"/>
...
         </Grid.RowDefinitions>
...
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding  Path=ActualHeight, ElementName=grdPgOpentMessSchight}" />                   
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
    </Grid>

Zeit er mir 514,... an.

bei

    <Grid Name="grdPgOpentMessSchight">
...
        <Grid.RowDefinitions>
            <RowDefinition Name="rowDefinitionHeight"/>
...
         </Grid.RowDefinitions>
...
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding  Path=ActualHeight, ElementName=rowDefinitionHeight}" />                   
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
    </Grid>
zeigt er mir 0 an.

Im XAML sind vom grdPgOpentMessSchight die ActualHeight und auch RowDefinitions.Count vorhanden.
Nun dachte ich mir, ... Mache ich mir doch einen Converter:

    public class GridActualHeightConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            double ergebnis = 0.0;
            if (value != null)
            {
                if (value is Grid)
                {
                    Grid grid = (Grid)value;
                    ergebnis = grid.ActualHeight / grid.RowDefinitions.Count;
                }
            }
            return ergebnis;
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }

und binde doch diesen ein, da ja s.oben beim Grid die ActualHeight vorhanden ist:

                <DataTemplate>
                    <TextBlock Text="{Binding   
                         Converter={StaticResource gridConverter},                         
                         ElementName=grdPgOpentMessSchight}">
                    </TextBlock>
                </DataTemplate>

... ja denkste ... im Converter ist die grid.ActualHeight = 0.0

ja und nun ???
private Nachricht | Beiträge des Benutzers
MarioR
myCSharp.de - Member



Dabei seit:
Beiträge: 3

Themenstarter:

Gelöst

beantworten | zitieren | melden

im XAML einen Loaded-Event setzen:

        <ListBox Grid.Row="0"  Grid.Column="0" Grid.RowSpan="9" Grid.ColumnSpan="2" HorizontalAlignment="Stretch" Margin="2" Name="lbMessSchichten" VerticalAlignment="Stretch" MouseDoubleClick="lbMessSchichten_MouseDoubleClick" ItemsSource="{Binding MessSchichten}" >
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Value}" Name="itemTextBlock" Loaded= "setItemHeight" />
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>


und im Code das Event erzeugen:


        void setItemHeight(object sender, RoutedEventArgs e)      {
            if ((sender == null) || (rowDefinitionHeight == null)) return;
            if (!(sender is TextBlock)) return;
            (sender as TextBlock).Height = rowDefinitionHeight.ActualHeight;        
        }
private Nachricht | Beiträge des Benutzers