如何分配一个ListView的高度请求取决于它里面的标签的文本的长度?



我有一个ListView,它的DataTemplate有一个ViewCell和两个Labels。我想做的是,ListView的大小与这两个Labels的文本成比例。如果它们不包含文本,则将ListView设置得很小,如果包含大量文本,则将其设置得很大。

这是我的实际代码:

<ListView HasUnevenRows="True" HeightRequest="{Binding heightList}" ItemsSource="{Binding sourceList}" SelectionMode="Single" SeparatorColor="Transparent" SeparatorVisibility="None">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<StackLayout>
<Label FontSize="14" LineBreakMode="NoWrap" Text="{Binding text1}" />
<Label FontSize="14" LineBreakMode="NoWrap" Text="{Binding text2}" />
</StackLayout>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>

如果text1/text2不是"你可以不绑定isVisible吗?像

bool IsTxt1Vis { get { return text1 != ""; } }

我想做的是,ListView的大小与这两个标签的文本成比例。如果它们不包含文本,把ListView设置得很小,如果它包含很多文本,把它设置得很大。

根据你的描述,你想调整listview的高度为最小尺寸适合儿童?如果是,你可以使用绑定ListView的hightrequest来实现。

首先,请设置ListView的VerticalOptions="StartAndExpand",否则ListView在StackLayout中的高度请求会被忽略。

<StackLayout>
<ListView
BackgroundColor="AliceBlue"
HasUnevenRows="True"
HeightRequest="{Binding rowHeigth}"
ItemsSource="{Binding sourceList}"
MinimumHeightRequest="50"
VerticalOptions="StartAndExpand">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<StackLayout>
<Label
FontSize="14"
LineBreakMode="NoWrap"
Text="{Binding text1}" />
<Label
FontSize="14"
LineBreakMode="NoWrap"
Text="{Binding text2}" />
</StackLayout>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
<Button
x:Name="addbtn"
Command="{Binding AddCommand}"
Text=" add data in listview" />
</StackLayout>

public partial class Page5 : ContentPage
{

public Page5()
{
InitializeComponent();

this.BindingContext = new listviewmodel();
}
}
public class listviewmodel:ViewModelBase
{
public ObservableCollection<listmodel> sourceList { get; set; }
private int _rowHeigth;
public int rowHeigth
{
get { return _rowHeigth; }
set
{
_rowHeigth = value;
RaisePropertyChanged("rowHeigth");
}
}
public ICommand AddCommand { protected set; get; }
public listviewmodel()
{
sourceList = new ObservableCollection<listmodel>()
{
new listmodel(){text1="test 1",text2="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
new listmodel(){text1="test 1",text2="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
new listmodel(){text1="test 1bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",text2="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacccccccccccccccccccccccccccc"},
new listmodel(){text1="test 1",text2="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
new listmodel(){text1="test 1",text2="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}
};
rowHeigth = sourceList.Count * 40;
AddCommand = new Command<listmodel>(async (key) => {
sourceList.Add(new listmodel() { text1 = "test 1", text2 = "aaaaaaaaaa" });
rowHeigth = sourceList.Count * 40;
});
}
}
public class listmodel
{
public string text1 { get; set; }
public string text2 { get; set; }
}

ViewModelBase是实现INotifyPropertyChanged接口的类。

public class ViewModelBase : INotifyPropertyChanged
{

public event PropertyChangedEventHandler PropertyChanged;

public void RaisePropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
}

最新更新