Laden...

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

Erstellt von MarioR vor 13 Jahren Letzter Beitrag vor 13 Jahren 3.291 Views
M
MarioR Themenstarter:in
3 Beiträge seit 2009
vor 13 Jahren
Binding im Style (TextBlock Height an Grid.Row.ActualHeigth)?

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

1.044 Beiträge seit 2008
vor 13 Jahren

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

M
MarioR Themenstarter:in
3 Beiträge seit 2009
vor 13 Jahren

... 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 ???

M
MarioR Themenstarter:in
3 Beiträge seit 2009
vor 13 Jahren
Gelöst

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;        
        }