在 ViewModel 中使用绑定在 StackLayout 中添加子项,Xamarin.Forms

Adding Children in StackLayout using Binding in ViewModel, Xamarin.Forms

我正在尝试在我的 Xamarin.Forms 项目中实施 MVVM。

这是我的 StackLayout 和 x:Name

<StackLayout x:Name="approvalsStack"></StackLayout>

这就是我在 StackLayout

中填充 Children 的方式
StackLayout stack = new StackLayout();
                    Frame frame = new Frame { BorderColor = Color.LightGray };
                    frame.Content = new Label { Text = a.FullName + " (" + a.Decision + ")" + " " + a.DecisionDate.ToString() };
                    stack.Children.Add(frame);
                    approvalsStack.Children.Add(stack);

现在我卡住了,如何使用 ViewModel/Binding.

填充子项

你不能那样做,如你所见here, Property Children in StackLayout is not a Bindable property

但是你可以解决这个问题,方法是通过实现 bindable-属性 来定制一个 属性,这将有一些 ItemSource 用于动态 adding/removing它的项目,或者你可以只使用 RepeaterView 的一些很棒的社区实现来实现 Xamarin.Forms,我建议你这样做。

RepeaterView 基本上是一个 Bindable StackLayout,您可以在其中动态填充项目。

我建议你看看这个here from Glenn Versweyveld,如果你想你可以在google或github上搜索更多的(但我强烈推荐你这个).

祝您编码顺利!

找到解决方案!!

https://github.com/HoussemDellai/Xamarin-Forms-RepeaterView/blob/master/Repeater/Repeater/RepeaterView.cs

1-使用 RepeaterView 的这个实现 2-将命名空间添加到 Xaml

<local:RepeaterView x:Name="approvalsStack" ItemsSource="{Binding Approvals}">
                        <local:RepeaterView.ItemTemplate>
                            <DataTemplate>
                                <ViewCell>
                                    <StackLayout>
                                        <Grid>
                                            <Grid.ColumnDefinitions>
                                                <ColumnDefinition Width="*"/>
                                                <ColumnDefinition Width="*"/>
                                                <ColumnDefinition Width="*"/>
                                            </Grid.ColumnDefinitions>
                                            <Label Grid.Column="0" Text="{Binding FullName}"/>
                                            <Label Grid.Column="1" Text="{Binding Decision}"/>
                                            <Label Grid.Column="2" Text="{Binding DecisionDate}"/>
                                        </Grid>
                                        <StackLayout>
                                            <BoxView HeightRequest="1" Color="Gray" HorizontalOptions="FillAndExpand"/>
                                        </StackLayout>
                                    </StackLayout>
                                </ViewCell>
                            </DataTemplate>
                        </local:RepeaterView.ItemTemplate>
                    </local:RepeaterView>

并绑定中继器视图,然后用 ViewModel

填充它