【问题标题】:How do I bind multiple viewmodels to a single view如何将多个视图模型绑定到单个视图
【发布时间】:2020-01-09 19:07:40
【问题描述】:

我在一个内容页面上有两个列表视图,因此我希望每个列表视图都有自己的视图模型作为 itemsoruce。

【问题讨论】:

  • 创建一种包含子视图模型的“MasterViewModel”。在这种情况下,您可以通过 Binding 将 ListView 绑定到 xaml 中的子视图模型
  • 我猜 Nehl 所说的就是你想要的。如果要设置单独的 ItemsSource,您只需要两个属性而不是单独的 ViewModel。但是,如果您希望 ItemsSource 来自单独的视图模型,我在回答中给出了解决方案,请检查。

标签: mvvm xamarin.forms


【解决方案1】:

为 ListView 添加单独的 ItemsSource 更容易。如果这是您正在寻找的。 可以使用 MainViewModel 中的两个属性来完成。

XAMl

<ListView
        ItemsSource="{Binding ListSource1}">
    </ListView>
    <ListView
        Grid.Column="1"
        ItemsSource="{Binding ListSource2}">
    </ListView>

ViewModel 类

public class MainViewModel
{
    public ObservableCollection<string> ListSource1 { get; set; }
    public ObservableCollection<string> ListSource2 { get; set; }

    public MainViewModel()
    {
        ListSource1 = new ObservableCollection<string>()
        {
            "I'm from first viewmodel",
            "I'm from first viewmodel",
            "I'm from first viewmodel",
            "I'm from first viewmodel",
            "I'm from first viewmodel",
            "I'm from first viewmodel"
        };

        ListSource2 = new ObservableCollection<string>()
        {
            "I'm from second ViewModel",
            "I'm from second ViewModel",
            "I'm from second ViewModel",
            "I'm from second ViewModel",
            "I'm from second ViewModel",
            "I'm from second ViewModel"
        };
    }
}

如果您希望添加来自不同 ViewModel 的源代码。

ListSource1 = new ViewModel1().ListSource;
ListSource2 = new ViewModel2().ListSource;

如果您希望设置 ListView 的 BindingContext,可以按照 Marco 的建议通过绑定 Binding Context 本身来完成。

但您还需要将 ViewModel 作为属性添加到主 ViewModel。

public ViewModel1 FirstViewModel { get; set; }
public ViewModel2 SecondViewModel { get; set; }

Xaml:

<ListView
     BindingContext="{Binding FirstViewModel}"

【讨论】:

    【解决方案2】:

    只需为 ListView 设置 BindingContext。

    在 Xaml 中:

    <ListView x:Name="list1">
    </ListView>
    
    <ListView x:Name="list2">
    </ListView>
    

    在后面的代码中绑定它:

    list1.BindingContext = ViewModel1;
    list2.BindingContext = ViewModel2;
    

    如果你想在后面的代码中绑定它,你也可以在 XAML 中使用 BindingContext-Property:

    <ListView ItemSource="{Binding itemList1}" BindingContext="{Binding ViewModel1}" />
    
    <ListView ItemSource="{Binding itemList2}" BindingContext="{Binding ViewModel2}" />
    

    但请记住,您需要一个“全局”绑定模型(或 MasterViewModel),它将嵌套的视图模型保留为子属性。

    【讨论】:

    • 你知道如何在 Xaml 中做到这一点吗?
    • 只使用 XAML 中的 BindingContext 属性,我编辑了我的答案
    猜你喜欢
    • 1970-01-01
    • 2012-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多