Xaml Xamarin.forms使用堆栈布局和网格在代码后面添加动态视图单元
我正在尝试创建一个如下所示的动态视图单元格,并将其添加到tableview中。 然而,在使用xaml.cs时,我似乎无法显示数据。我无法使用stack layout属性在视图单元格内创建网格。下面是我尝试过的代码。有人请帮助我,我陷入困境,我似乎无法在谷歌上找到答案:( 以下是我在xaml表单上编写的代码:Xaml Xamarin.forms使用堆栈布局和网格在代码后面添加动态视图单元,xaml,tableview,xamarin.forms,Xaml,Tableview,Xamarin.forms,我正在尝试创建一个如下所示的动态视图单元格,并将其添加到tableview中。 然而,在使用xaml.cs时,我似乎无法显示数据。我无法使用stack layout属性在视图单元格内创建网格。下面是我尝试过的代码。有人请帮助我,我陷入困境,我似乎无法在谷歌上找到答案:( 以下是我在xaml表单上编写的代码: <ViewCell x:Name="viewCellM"> <StackLayout Orientation="Horizontal"> &
<ViewCell x:Name="viewCellM">
<StackLayout Orientation="Horizontal">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="10">
</ColumnDefinition>
<ColumnDefinition Width="250">
</ColumnDefinition>
<ColumnDefinition Width="*">
</ColumnDefinition>
</Grid.ColumnDefinitions>
<Label x:Name="M" Text="Block M" YAlign="Center" Grid.Row="0" Grid.Column="1"></Label>
<Image x:Name="ImageM" Source="check_mark.jpg" Grid.Row="0" Grid.Column="2"></Image>
</Grid>
</StackLayout>
</ViewCell>
下面是我尝试使用的代码,但它没有显示任何内容,希望有人能指导我:
for (int m = 0; m < filterList.Count; m++)
{
Grid gridAdd = new Grid
{
ColumnDefinitions =
{
new ColumnDefinition { Width = new GridLength(10,GridUnitType.Absolute)},
new ColumnDefinition { Width = new GridLength(250,GridUnitType.Absolute)},
new ColumnDefinition { Width = new GridLength(1,GridUnitType.Star)},
}
};
gridAdd.Children.Add (new Label { TextColor = Color.Black, Text = "Block L Level 2" }, 1, 0);
blockSection.Add(new ViewCell()
{
View = new StackLayout {
Orientation = StackOrientation.Horizontal,
Children = gridAdd
}
});
ForceLayout();
}
}
for(int m=0;m
非常感谢您的帮助:)我不太确定您的代码想要实现什么,但我假设您希望在UI中显示所有
过滤器列表
项的列表
这里有一个大概的轮廓如何做到这一点
首先,将您的过滤器列表
设置为可观察的集合
,过滤器项
应实现INotifyPropertyChanged
public class FilterItem: INotifyPropertyChanged{
public event PropertyChangedEventHandler PropertyChanged;
bool _IsChecked
public bool IsChecked{
get { return _IsChecked;}
set { SetProperty(ref _IsChecked, value);}
}
bool _BlockM
public bool BlockM{
get { return _BlockM;}
set { SetProperty(ref _BlockM, value);}
}
private void SetProperty<T>(ref T backingField, T newValue, [CallerMemberName] string propertyName = null){
if (backingField!=newValue){
backingField = newValue;
if (PropertyChanged!=null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
很抱歉,我真的不明白可观察集合的作用是什么?你能解释一下它的实际用途吗?我想循环浏览过滤器列表,并将每个项目作为视图单元格添加到tableview中。图像只是一个复选标记,我根据用户的选择将其设置为可见或否。当一个被选中时,另一个则不被选中。一次一个。感谢您的帮助:)@Sten Petrov只想将标签设置为包含筛选项的文本,并且它会有一个点击手势供用户点击。这只是我正在做的一个粗略的想法:)@huiru the
ListView.ItemsSource
获取可观察的集合,并在每次添加/删除项目时更新ListView。您不需要在代码中构建ViewCell,事实上这根本不起作用。而是在XAML中创建ViewCell模板,并在向ItemsSource集合添加/删除项目时自动复制该模板我不知道如何添加项目,该项目是最终绑定到标签的过滤器名称?如何将它添加到filterLIst中,将我从Web服务调用的obj添加到列表中?以前我使用的列表filobject=new list();存储对象列表,但不确定如何在可观察的集合中执行。我真的不明白SetProperty做什么。希望你能指导我:)谢谢!
...
<ListView x:Name="lvFilter">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="10">
</ColumnDefinition>
<ColumnDefinition Width="250">
</ColumnDefinition>
<ColumnDefinition Width="*">
</ColumnDefinition>
</Grid.ColumnDefinitions>
<Image Source="check_mark.jpg" Grid.Column="0" IsVisible="{Binding IsChecked, Converter={...}}"/>
<Label Text="Block M" YAlign="Center" Grid.Column="1"/>
<Label Text="{Binding BlockM}" YAlign="Center" Grid.Column="2"/>
</Grid>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
public class MyView: ..
...
private readonly ObservableCollection<FilterItem> filterList = new ...;
...
public MyView(){
InitializeComponent();
lvFilter.ItemsSource = filterList;
}
}