【发布时间】:2017-10-12 14:49:44
【问题描述】:
我有一个包含两个堆栈布局的列表。单击需要显示/隐藏第二个堆栈的第一个堆栈。这在 android 中运行良好,但在 iOS 中无法运行。当 IsVisible 为真时,布局不会扩展。
<ListView ItemsSource="{Binding PackageList}"
ItemSelected="Package_ItemSelected"
IsPullToRefreshEnabled="true"
HasUnevenRows="True"
SeparatorVisibility="None">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="60"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<StackLayout Grid.Row="0" Padding="10" Orientation="Horizontal" Spacing="10" BackgroundColor="#f2f2f2">
<Image Source="{Binding Item.PackageType}" VerticalOptions="CenterAndExpand"/>
<StackLayout Spacing="5" VerticalOptions="Center">
<Label Text="{Binding Item.PackageName}" Style="{DynamicResource LabelStyle}" YAlign="Center"/>
<Label Text="(can accept/decline request only)" IsVisible="{Binding Item.PackageType}" Style="{DynamicResource LabelGraySmall}" LineBreakMode="WordWrap" YAlign="Center"/>
</StackLayout>
<Grid HorizontalOptions="EndAndExpand" >
<Image Source="up.png" Style="{DynamicResource ArrowStyle}" IsVisible="{Binding IsVisible}" VerticalOptions="CenterAndExpand"/>
<Image Source="downsmall.png" Style="{DynamicResource ArrowStyle}" IsVisible="{Binding IsNotVisible}" VerticalOptions="CenterAndExpand"/>
</Grid>
</StackLayout>
<StackLayout Grid.Row="1" Padding="15" Spacing="10" IsVisible="{Binding IsVisible}">
<StackLayout.GestureRecognizers>
<TapGestureRecognizer Tapped="TapGestureRecognizer_Tapped"/>
</StackLayout.GestureRecognizers>
<Label Text="{Binding Item.Description}" Style="{DynamicResource LabelStyle}" YAlign="Center" HorizontalTextAlignment="Center" HorizontalOptions="CenterAndExpand"/>
<Button Text="Choose Package" Command="{Binding Path=BindingContext.PackageCommand,Source={x:Reference packagePage}}" CommandParameter="{Binding Item}" Style="{DynamicResource ButtonBlue}" WidthRequest="200" HeightRequest="40" HorizontalOptions="CenterAndExpand" />
</StackLayout>
</Grid>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
后端代码
private void Package_ItemSelected(object sender, SelectedItemChangedEventArgs e)
{
if (e.SelectedItem == null) return;
if (e.SelectedItem != null)
{
var tappedItem = (PackageWrapper<PackageResult>)e.SelectedItem;
tappedItem.IsNotVisible = !tappedItem.IsNotVisible;
tappedItem.IsVisible = !tappedItem.IsNotVisible;
}
((ListView)sender).SelectedItem = null;
}
包装类:
public class PackageWrapper<T> : INotifyPropertyChanged
{
public T Item { get; set; }
bool isVisible = false;
public bool IsVisible
{
get
{
return isVisible;
}
set
{
if (isVisible != value)
{
isVisible = value;
PropertyChanged(this, new PropertyChangedEventArgs("IsVisible"));
}
}
}
bool isNotVisible = true;
public bool IsNotVisible
{
get
{
return isNotVisible;
}
set
{
if (isNotVisible != value)
{
isNotVisible = value;
PropertyChanged(this, new PropertyChangedEventArgs("IsNotVisible"));
}
}
}
public event PropertyChangedEventHandler PropertyChanged = delegate { };
}
详情请看截图
以下是我在 iOS 中得到的内容
【问题讨论】:
-
请输入您的代码,因为使用 IsVisible 它在 ios 和 android 中都可以正常工作,我认为代码中存在一些问题。
-
@Pratik 已更新代码
标签: xamarin xamarin.ios xamarin.forms