<Border CornerRadius="2,2,2,2" BorderThickness="1" BorderBrush="LightSkyBlue" Margin="5,2,2,2" x:Name="PersonBorder" Visibility="Collapsed">
<StackPanel Orientation="Vertical">
<ListBox Name="personListBoxTest"
BorderThickness="0"
ScrollViewer.HorizontalScrollBarVisibility="Hidden"
ScrollViewer.VerticalScrollBarVisibility="Auto"
HorizontalContentAlignment="Stretch"
Background="LemonChiffon"
>
<ListBox.ItemTemplate >
<DataTemplate>
<StackPanel>
<StackPanel Orientation="Horizontal" Background="Pink">
<StackPanel Orientation="Horizontal" Visibility="{Binding ElementName=Involvement, Path=Text, Converter={StaticResource cIsVisibleOrCollapsed}}" Margin="0,0,5,0">
<TextBlock Text="Involvement:"/>
<TextBlock Margin="5,0,0,0" Text="{Binding Path=NameInvolvementType}" Foreground="Blue" x:Name="Involvement"/>
</StackPanel>
<StackPanel Orientation="Horizontal">
<TextBlock Text="Name:"/>
<TextBlock Margin="3,0,0,0" Text="{Binding Path=FirstName}" Foreground="Blue" />
<TextBlock Margin="3,0,0,0" Text="{Binding Path=MiddleName}" Foreground="Blue" />
<TextBlock Margin="3,0,0,0" Text="{Binding Path=LastName}" Foreground="Blue" />
<TextBlock Margin="3,0,0,0" Text="{Binding Path=NameSuffix}" Foreground="Blue" />
<TextBlock Margin="5,0,0,0" Text="DOB:"/>
<TextBlock Margin="3,0,0,0" Text="{Binding Path=BirthDate, StringFormat=MM/dd/yyyy}" Foreground="Blue" />
</StackPanel>
</StackPanel>
<StackPanel Visibility="{Binding ElementName=myEventAddress,Path=Visibility, Converter={StaticResource cVisibilityMirror}}" Orientation="Horizontal" >
<TextBlock Text="Address:" />
<EventDet:EventAddress Margin="5,0,0,0" x:Name="myEventAddress" Foreground="Blue" CityTextBlockOrientation="Horizontal" />
</StackPanel>
<StackPanel Visibility="{Binding ElementName=Phone1, Path=Text, Converter={StaticResource cIsVisibleOrCollapsed}}" Orientation="Horizontal">
<TextBlock Text="Home:" />
<TextBlock Margin="5,0,0,0" Text="{Binding Path=Phone1}" Foreground="Blue" x:Name="Phone1"/>
</StackPanel>
<StackPanel Visibility="{Binding ElementName=Phone2, Path=Text, Converter={StaticResource cIsVisibleOrCollapsed}}" Orientation="Horizontal">
<TextBlock Text="Mobile:" />
<TextBlock Margin="5,0,0,0" Text="{Binding Path=Phone2}" Foreground="Blue" x:Name="Phone2"/>
</StackPanel>
<StackPanel Visibility="{Binding ElementName=Phone3, Path=Text, Converter={StaticResource cIsVisibleOrCollapsed}}" Orientation="Horizontal">
<TextBlock Text="Work:" />
<TextBlock Margin="5,0,0,0" Text="{Binding Path=Phone3}" Foreground="Blue" x:Name="Phone3"/>
</StackPanel>
<StackPanel x:Name="PersonAlertSP" Visibility="Collapsed" Background="WhiteSmoke">
<TextBlock Text="Alerts:" />
<ListBox ItemsSource="{Binding Path=PersonAlertList}" x:Name="PersonAlertListBox" BorderThickness="1" >
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Path=AlertType}" Margin="0,0,5,0" Foreground="Blue" Width="150"/>
<TextBlock Text="{Binding Path=Description}" Margin="0,0,5,0" Foreground="Blue"/>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</StackPanel>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</StackPanel>
</Border>
код позади:
//this is a little unweidly, but its test code until this works
MobileWPF.singleton.EventDetailsTabControl.myEventDetailControl.personListBoxTest.ItemsSource =
dc.SessionEvent.SessionPersons.ToList();
Вот изображение результата с 6 пунктами, все данные - бессмысленные данные теста:
![screenshot](https://i.stack.imgur.com/UfZDN.jpg)
РЕДАКТИРОВАТЬ 2:
Немного поиграв с этим, я думаю, это то, что происходит ... Сначала ListBox является жадным и занимает максимальное количество вертикального пространства, затем выполняются некоторые вычисления IValueConverter, а некоторые элементы сворачиваются. Однако, как только это будет сделано, высота ListBox не обновляется.
РЕДАКТИРОВАТЬ 3:
Я попытался преобразовать PersonListBoxTest в ItemsControl, а не в ListBox, с единственной разницей в коде и объявлением <ItemsControl.ItemTemplate >
... И теперь все работает как положено, без лишних пробелов.
Так что каким-то образом ItemsControl учитывает тот факт, что некоторые из моих элементов свернуты через IValueConverters, а ListBox нет. Я поиграл с атрибутом VirtualizingStackPanel в ListBox, установив для IsVirtualizing значения true и false (без изменений) перед тестированием ItemsControl.
Я дам очки всем, кто может объяснить, почему это работает, как я это наблюдал.
Спасибо всем за ваши ответы, вы никогда не знаете, что будет иметь значение.
Вот пример используемого IValueConverter, все они примерно одинаковы.
[ValueConversion(typeof(object), typeof(System.Windows.Visibility))]
public class NullToVisibleOrCollapsed : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value == null) return System.Windows.Visibility.Collapsed;
if (value is Image)
{
if (((Image)value).Source == null) return System.Windows.Visibility.Collapsed;
return System.Windows.Visibility.Visible;
}
if (value is string)
{
string myString = (string)value;
if (string.IsNullOrEmpty(myString) == true)
return System.Windows.Visibility.Collapsed;
}
if (value is int)
{
int myInt = (int)value;
if (myInt == 0)
return System.Windows.Visibility.Collapsed;
}
return System.Windows.Visibility.Visible;
}