如何在 Xamarin 中将 View 绑定到 ViewCell

Posted

技术标签:

【中文标题】如何在 Xamarin 中将 View 绑定到 ViewCell【英文标题】:How can I bind View to ViewCell in Xamarin 【发布时间】:2021-11-26 16:14:02 【问题描述】:

所以我在做一个 MVVM 应用程序并且有一个问题:我需要在应用程序中动态创建一个界面。所以我用Collection创建了一个ViewModel。

public ObservableCollection<ViewCell> dataTemplate  get; set; 

并添加一个添加新元素的按钮

private void NewOther(object obj)
    
        IsBusy = true;
        try
                        
            ViewCell other = new ViewCell
            
                View = new StackLayout
                
                    Children =  new Label  Text = "I m New"  
                

            ;
            
            dataTemplate.Add(other);
        
        catch (Exception ex)
        
            Debug.WriteLine(ex);
        
        finally
        
            IsBusy = false;
         
    

在 Xaml 中我有:

<RefreshView Padding="5" Command="Binding LoadCheckListsCommand" IsRefreshing="Binding IsBusy, Mode=TwoWay">            
        <ListView ItemsSource="Binding dataTemplate">
            <ListView.Header>
                <Grid ColumnDefinitions="*,*,*">
                    <Button Text="Add Measurment" Grid.Column="0" Command="Binding AddMeasurment"/>
                    <Button Text="Add Pattern" Grid.Column="1" Command="Binding AddPattern"/>
                    <Button Text="Add Other" Grid.Column="2" Command="Binding AddOther"/>
                </Grid>
            </ListView.Header>
            <ListView.Footer>
                <StackLayout Orientation="Horizontal" Margin="0,10,0,0">
                    <Button Text="Cancel" Command="Binding CancelCommand" HorizontalOptions="FillAndExpand"></Button>
                    <Button Text="Save" Command="Binding SaveCommand" HorizontalOptions="FillAndExpand"></Button>
                </StackLayout>
            </ListView.Footer>
            
            
        </ListView>
    </RefreshView>

所以,在我按下AddOther 之后,我有一个带有文本“Xamrin.Forms.ViewCell”的新元素,我认为这只是viewcell.ToString()

这里如何绑定view cell的内容?

【问题讨论】:

是的,默认情况下 ListView 和 CollectionView 使用ToString()。您可能必须在 XAML 中声明 ListView.ItemTemplate 【参考方案1】:

要达到你的要求,你必须知道

    我们经常使用Data作为source并绑定到control/layout,直接设置View作为source是不正确的。

    ListView 共享同一个模板,也就是说行应该是相同的,我们不能在运行时添加不同的模板。


作为一种解决方法,我们可以使用TableView

TableView 没有 ItemsSource 的概念,因此必须手动将项添加为子项。

示例代码

//xaml
<TableView>
     <TableSection x:Name="section">
          <ImageCell ImageSource="dog.png"/>
          <SwitchCell On="True"/>
      </TableSection>
</TableView>
//code behind
private void NewOther(object obj)

    ViewCell other = new ViewCell
    
        View = new StackLayout
        
            Children =  new Label  Text = "I m New"  
         

     ;
     section.Add(other);

屏幕截图

参考

https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/listview/data-and-databinding.

https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/tableview.

【讨论】:

那么,我什至无法将 cellview 绑定到 Tableview? 是的,不能绑定到任何布局,但你可以按照我提供的方式在代码中动态添加。

以上是关于如何在 Xamarin 中将 View 绑定到 ViewCell的主要内容,如果未能解决你的问题,请参考以下文章

在 Xamarin 表单中将 Observable 集合绑定到我的 ListView 时遇到问题

如何在 Xamarin Forms 中将 ListView 按钮的绑定上下文设置为父级的绑定上下文

Xamarin 表单:如何引用父绑定

如何在 Rider 中设置 Xamarin.ios 视图的属性? (如何更新自动生成的 View.designer.cs?)

聊聊 Vue 的双向数据绑定,Model 如何改变 View,View 又是如何改变 Model 的

在 MAUI 中将命令绑定到父视图模型