/ / Powiązanie elementów WPF z dynamicznie generowanymi elementami interfejsu użytkownika - wpf, dynamic, binding, element

Wiązanie elementów WPF z dynamicznie generowanymi elementami interfejsu użytkownika - wpf, dynamic, binding, element

Mam stronę, na której mam siatkę z 2kolumny, jedna mieszcząca 80 * szerokości, a druga mieszcząca 20 *. Pod siatką znajduje się panel stosów, do którego ładuję elementy interfejsu użytkownika (panele stosów potomnych) w czasie wykonywania.

Moim celem jest związanie szerokościStackpanels do kolumn siatki. Działa to doskonale, a rozmiar stosów zmienia się, jeśli zawartość dynamiczna jest wyśmiewana, aby była statyczna w widoku projektu. Ale gdy aplikacja jest uruchamiana, powiązania zawodzą, a szerokości nie są powiązane.

Czy istnieje sposób na odświeżenie powiązań, aby można było powiadomić panele sterujące, aby wskazały szerokości siatki i skonfigurowały jej rozmiar?

Zaktualizowano: Tak wygląda mój XAML:

<Page x:Class="WPFTestApp.Page1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Page1">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>

<Grid x:Name="resizeGrid"
Grid.Column="0" Grid.Row="0">
<Grid.ColumnDefinitions>
<ColumnDefinition x:Name="leftColumn"
Width="80*" />
<ColumnDefinition x:Name="rightColumn"
Width="20*" />
</Grid.ColumnDefinitions>
</Grid>

<StackPanel x:Name="contentPanel"
Grid.Column="0" Grid.Row="0" >
<!-- Dynamic StackPanels are added here -->
</StackPanel>
</Grid>
</Page>

W moim kodzie tworzę elementy StackPanel i dodajemy je do contentPanel, mówiąc: contentPanel.Children.Add (...);

Niestety, MUSZĘ użyć tutaj StackPaneli. :-(

Znaczniki dynamicznie utworzonego elementu StackPanel są następujące (zauważ, że używam wiązania do siatki już w XAML):

<StackPanel x:Name="element01"
Orientation="Horizontal"
Width="{Binding ElementName=resizeGrid, Path=ActualWidth}" >
<StackPanel x:Name="leftPanel"
Orientation="Vertical"
Width="{Binding ElementName=leftColumn, Path=ActualWidth}">
<!-- Content goes here -->
</StackPanel>
<StackPanel x:Name="rightPanel"
Orientation="Vertical"
Width="{Binding ElementName=rightColumn, Path=ActualWidth}">
<!-- Content goes here -->
</StackPanel>
</StackPanel>

Kod XAML dla moich dynamicznych elementów StackPanel jest generowany przez transformację XSLT

Zwróć uwagę na przestrzeń nazw xmlns: x dynamiczny StackPanel. Trzeba to również zrobić, ponieważ jest generowany przez XSLT

Odpowiedzi:

0 dla odpowiedzi № 1

O ile wiem, ustawienie Width z StackPanel z Orientation="Horizontal" nie przyniesie efektu. Rozmiar a StackPanel nie przekracza rozmiaru treści w kierunku zorientowanym.

Dlaczego "MUSISZ" używać? StackPaneltu jest? Prawie na pewno chcesz DockPanels, biorąc pod uwagę twój cel. Nie musisz niczego wiązać ani ustawiać, ponieważ DockPanel wypełni komórkę automatycznie.


0 dla odpowiedzi nr 2

Spróbuj powiązać ActualWidth zamiast Width.

<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>

<Grid x:Name="resizeGrid"
Grid.Column="0" Grid.Row="0">
<Grid.ColumnDefinitions>
<ColumnDefinition x:Name="leftColumn"
Width="{Binding ElementName=contentPanel, Path=ActualWidth}" />
<ColumnDefinition x:Name="rightColumn"
Width="*" />
</Grid.ColumnDefinitions>
</Grid>


<StackPanel x:Name="contentPanel"
Grid.Column="0" Grid.Row="0" HorizontalAlignment="Left" >
<StackPanel Background="Yellow" Width="100" Height="25" />
<StackPanel Background="Green" Width="120" Height="25" />
<StackPanel Background="Red" Width="140" Height="25" />
<TextBlock Background="Gray" Text="{Binding ElementName=contentPanel, Path=ActualWidth}" />
</StackPanel>
</Grid>

Poniżej dokonałem następujących zmian:
1) Ustaw leftColumn do ActualWidth z contentPanel
2) Ustaw rightColumn do *
3) contentPanel HorizontalAlignment powinien zostać zmieniony w inny sposób Stretch. Tutaj zmieniłem to na Left

HTH


0 dla odpowiedzi № 3

Znalazłem rozwiązanie tego problemu. (Przepraszam za późną odpowiedź)

To, co zrobiłem, wyciąłem i wkleiłem kontrolkę Grid "resizeGrid" do Stackpanelu "contentPanel".

Jak wspomniałem powyżej, zawartość wcontentPanel są generowane poprzez transformację XSLT, co z pewnością tworzy problem odniesienia dla przestrzeni nazw. Zauważyłem komunikat "element nie został odnaleziony ..." w oknie Output po załadowaniu tego okna - to mnie udowodniło.

Wstawienie "resizeGrid" do "contentPanel" pomogło, ponieważ wtedy oba kontrolki są w tej samej przestrzeni nazw i można się z nimi odwoływać do właściwości PropertyBinding za pomocą atrybutu "ElementName".

Dziękuję za Twoje wsparcie! :-)