Xamarin Forms 1 视图绑定到多个对象

问题描述

所以我必须质疑如何将多个对象绑定到 1 个视图,因为从我收集到的信息来看,您不能将多个对象(也称为内容)绑定到每个视图。我从 sql db 和 mongo db 获得数据,从一个项目获得数据,从另一个获得产品。我希望能够从基于项目和产品模型的视图中输入数据,并将其显示到从 2prevIoUs 混合的第三个对象中。想法是为某些项目生成从仓库中取出的产品的库存日志。

解决方法

是的,您可以创建一个包含绑定到视图所需的所有数据(多个对象)的 ViewModel。

您可以参考官方示例Xamarin.Forms - CollectionView

以一页VerticalListSinglePreSelectionPage.xaml为例,我们可以将我们的数据添加到视图模型MonkeysViewModel.cs中,如下所示:

   public class MonkeysViewModel : INotifyPropertyChanged
{
    readonly IList<Monkey> source;
    Monkey selectedMonkey;
    int selectionCount = 1;

    public ObservableCollection<Monkey> Monkeys { get; private set; }
    public IList<Monkey> EmptyMonkeys { get; private set; }

    public Monkey SelectedMonkey
    {
        get
        {
            return selectedMonkey;
        }
        set
        {
            if (selectedMonkey != value)
            {
                selectedMonkey = value;
            }
        }
    }

    ObservableCollection<object> selectedMonkeys;
    public ObservableCollection<object> SelectedMonkeys
    {
        get
        {
            return selectedMonkeys;
        }
        set
        {
            if (selectedMonkeys != value)
            {
                selectedMonkeys = value;
            }
        }
    }

    public string SelectedMonkeyMessage { get; private set; }

   // other code
}

并且我们可以在xaml中绑定多个对象,这里我们在页面VerticalListSinglePreSelectionPage.xaml中绑定SelectedMonkeyMessage,Monkeys,SelectedMonkey和Command MonkeySelectionChangedCommand,就像如下:

<StackLayout Margin="20">
    <Label Text="{Binding SelectedMonkeyMessage}" />
    <CollectionView ItemsSource="{Binding Monkeys}"
                    SelectionMode="Single"
                    SelectedItem="{Binding SelectedMonkey}"
                    SelectionChangedCommand="{Binding MonkeySelectionChangedCommand}">
        <CollectionView.ItemTemplate>
            <DataTemplate>
                <Grid Padding="10">
                    <Grid.RowDefinitions>
                        <RowDefinition Height="Auto" />
                        <RowDefinition Height="Auto" />
                    </Grid.RowDefinitions>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="Auto" />
                        <ColumnDefinition Width="Auto" />
                    </Grid.ColumnDefinitions>
                    <Image Grid.RowSpan="2" 
                           Source="{Binding ImageUrl}" 
                           Aspect="AspectFill"
                           HeightRequest="60" 
                           WidthRequest="60" />
                    <Label Grid.Column="1" 
                           Text="{Binding Name}" 
                           FontAttributes="Bold" />
                    <Label Grid.Row="1"
                           Grid.Column="1" 
                           Text="{Binding Location}"
                           FontAttributes="Italic" 
                           VerticalOptions="End" />
                </Grid>
            </DataTemplate>
        </CollectionView.ItemTemplate>
    </CollectionView>
 </StackLayout>