有没有办法根据运行时的条件动态显示/隐藏ListView的标题。
<ListView x:Name="ListViewChallenges" Header="{Binding .}">
<ListView.FooterTemplate>
<DataTemplate>
<Label Text="No Elements found." IsVisible="{Binding FooterIsVisible}" />
</DataTemplate>
</ListView.FooterTemplate>
<!-- ... -->
</ListView>
在BindingContext中,我声明了FooterIsVisible属性。当它是假的时,页脚应该是不可见的。但是这不起作用,页脚总是占用ListView底部的Label的一定空间。
这有可能吗?
答案 0 :(得分:6)
您应该能够隐藏页脚,而不是占用任何空间。我相信您需要为<ion-slide-page ng-repeat="item in lista_tutorial[0].lista_slide" ng-if="!$first">
<div ng-if="item.tipo == 'benvenuto'" class="divBenvenutoTreVeline">
ABC
</div>
<div ng-if="item.tipo == 'home'" class="divBenvenutoTreVeline">
BCD
</div>
<ion-slide-page>
中的标签设置HeightRequest
。你可以通过以下方式做到这一点:
FooterTemplate
答案 1 :(得分:1)
您应该使用FooterTemplate和Footer属性。它作为ItemTemplate和ItemSource:
<ListView Footer="{Binding IsFooterVisible}">
<ListView.FooterTemplate>
<DataTemplate>
<!-- Footer content. Always visible -->
</DataTemplate>
<ListView.FooterTemplate>
</ListView>
并绑定到Footer属性的东西可以为空(例如对象)。或者您可以使用转换器转换:true - &gt; new object()和false - &gt;空
还可以创建ListView的子类。我的例子(IsLoading属性是你要搜索的):
的Xaml:
<?xml version="1.0" encoding="UTF-8"?>
<ListView xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="Panor.Views.LoadableListView"
x:Name="element"
>
<ListView.FooterTemplate>
<DataTemplate>
<ContentView>
<ActivityIndicator IsRunning="true"
Margin="0, 5"
Color="{StaticResource mainColor}"
VerticalOptions="CenterAndExpand"
HorizontalOptions="CenterAndExpand"
>
<ActivityIndicator.Scale>
<OnPlatform x:TypeArguments="x:Double" iOS="2" Android="1" />
</ActivityIndicator.Scale>
</ActivityIndicator>
</ContentView>
</DataTemplate>
</ListView.FooterTemplate>
</ListView>
代码隐藏:
public partial class LoadableListView : ListView
{
public LoadableListView()
{
InitializeComponent();
this.ItemAppearing += OnItemAppearing;
}
public static readonly BindableProperty IsLoadingProperty = BindableProperty.Create(
nameof(IsLoading),
typeof(bool),
typeof(LoadableListView),
false,
propertyChanged: (bindable, oldValue, newValue) =>
{
var element = (LoadableListView)bindable;
element.Footer = (bool)newValue ? new object() : null;
}
);
public bool IsLoading
{
set => SetValue(IsLoadingProperty, value);
get => (bool)GetValue(IsLoadingProperty);
}
public static readonly BindableProperty ScrolledDownCommandProperty = BindableProperty.Create(
nameof(ScrolledDownCommand),
typeof(ICommand),
typeof(LoadableListView)
);
public ICommand ScrolledDownCommand
{
set => SetValue(ScrolledDownCommandProperty, value);
get => (ICommand)GetValue(ScrolledDownCommandProperty);
}
void OnItemAppearing(object sender, ItemVisibilityEventArgs e)
{
if (ItemsSource == null) return;
if (ScrolledDownCommand == null) return;
object last = null;
if (ItemsSource is IList)
{
var length = (ItemsSource as IList).Count;
last = (ItemsSource as IList)[length - 1];
}
else
{
foreach (var item in ItemsSource)
last = item;
}
if (e.Item == last && ScrolledDownCommand.CanExecute(null))
ScrolledDownCommand.Execute(null);
}
耗竭与:
<views:LoadableListView ItemsSource="{Binding ItemSource}"
RowHeight="120"
SeparatorColor="#c7c8c9"
IsLoading="{Binding IsMoreLoading}"
ScrolledDownCommand="{Binding ScrolledDownCommand}"
IsPullToRefreshEnabled="true"
IsRefreshing="{Binding IsRefreshing}"
RefreshCommand="{Binding RefreshCommand}"
>
<views:LoadableListView.ItemTemplate>
<DataTemplate>
<cells:MagazinesListCell Name="{Binding Name}"
Publisher="{Binding Publisher}"
Price="{Binding Price}"
Image="{Binding Converter={StaticResource UriToImageSourceConvertor}, Path=Image}"
Commands="{Binding Commands}"
/>
</DataTemplate>
</views:LoadableListView.ItemTemplate>
</views:LoadableListView>
答案 2 :(得分:0)
您可以将页脚模板包裹在ViewCell
中,然后在您不希望它显示时将ViewCell
的{{1}}设置为0。如果您这样做,请务必将Height
属性设置为ListView.HasUnevenRows
:
True
答案 3 :(得分:0)
以下是解决方案:
<ListView.FooterTemplate>
<DataTemplate>
<!--VIEW-->
<ActivityIndicator IsRunning="true" IsVisible="{Binding IsLoadingOnDemand}" HorizontalOptions="CenterAndExpand" Margin="15">
<ActivityIndicator.Triggers>
<Trigger TargetType="ActivityIndicator" Property="IsVisible" Value="False">
<Setter Property="HeightRequest" Value="0" />
</Trigger>
</ActivityIndicator.Triggers>
</ActivityIndicator>
</DataTemplate>
</ListView.FooterTemplate>
&#13;
答案 4 :(得分:0)
这对我来说没有temlpate(如果您需要从父.cs代码中的标题引用元素,则模板将不起作用)。因此,必须将容器的高度设为0而不是0,并切换可见性。
.SendMail
答案 5 :(得分:0)
如果由于列表视图为空而要隐藏页脚,只需设置
semaphore_t mSemaphore;
kern_return_t result = semaphore_create(mach_task_self(), &mSemaphore, SYNC_POLICY_FIFO, 0);
// Do stuff with semaphore wait and signal ...
kern_return_t result = semaphore_destroy(mach_task_self(), mSemaphore);
答案 6 :(得分:0)
我尝试了以下所有变体:
1)Header
属性绑定new object()
或null
2)两个没有转换器(https://stackoverflow.com/a/53197844/7429947)的堆栈布局
3)DataTrigger
和Trigger
在变更IsVisible
上设置为HeightRequest
这对我没有帮助,然后我在“ HeightRequest”上替换了MinimumHeightRequest
,第二个变体对iOS和Android有所帮助!
Xamarin.Forms版本:4.6.0.726