Xaml Xamarin.forms使用堆栈布局和网格在代码后面添加动态视图单元

Xaml Xamarin.forms使用堆栈布局和网格在代码后面添加动态视图单元,xaml,tableview,xamarin.forms,Xaml,Tableview,Xamarin.forms,我正在尝试创建一个如下所示的动态视图单元格,并将其添加到tableview中。 然而,在使用xaml.cs时,我似乎无法显示数据。我无法使用stack layout属性在视图单元格内创建网格。下面是我尝试过的代码。有人请帮助我,我陷入困境,我似乎无法在谷歌上找到答案:( 以下是我在xaml表单上编写的代码: <ViewCell x:Name="viewCellM"> <StackLayout Orientation="Horizontal"> &

我正在尝试创建一个如下所示的动态视图单元格,并将其添加到tableview中。 然而,在使用xaml.cs时,我似乎无法显示数据。我无法使用stack layout属性在视图单元格内创建网格。下面是我尝试过的代码。有人请帮助我,我陷入困境,我似乎无法在谷歌上找到答案:(

以下是我在xaml表单上编写的代码:

 <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;
  }
}