Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将集合从ViewModel获取到视图?_C#_Mvvm_Xamarin.forms - Fatal编程技术网

C# 如何将集合从ViewModel获取到视图?

C# 如何将集合从ViewModel获取到视图?,c#,mvvm,xamarin.forms,C#,Mvvm,Xamarin.forms,我有一个对象的observeCollection,该对象存储在ViewModel中,对于每个对象,我想在我的视图中添加一个BoxView。我计划在XAML代码中构建boxview,使其与业务逻辑分离。我的问题是,我无法从视图中找到访问视图模型中集合的正确方法。是否有方法将视图中的集合变量绑定到视图模型中的集合变量,或者可能有人知道更好的方法来实现类似的功能?您应该使用{Binding}语法使用{Binding}将视图模型集合绑定到列表视图的ItemsSource属性。您可以在中看到这方面的示例

我有一个对象的
observeCollection
,该对象存储在
ViewModel
中,对于每个对象,我想在我的
视图中添加一个
BoxView
。我计划在XAML代码中构建
boxview
,使其与业务逻辑分离。我的问题是,我无法从
视图
中找到访问
视图模型
中集合的正确方法。是否有方法将
视图中的集合变量绑定到
视图模型中的集合变量,或者可能有人知道更好的方法来实现类似的功能?

您应该使用
{Binding}
语法使用
{Binding}
将视图模型集合绑定到
列表视图的
ItemsSource
属性。您可以在中看到这方面的示例

不要忘记将
BindingContext
设置为
ViewModel
类的实例

要定义每个项目的显示方式,您需要声明一个
ItemTemplate
。基于您的需求的简单示例如下:

<ListView x:Name="MyList" ItemsSource="{Binding Data}">
   <ListView.ItemTemplate>
      <DataTemplate>
         <BoxView />
      </DataTemplate>
   </ListView.ItemTemplate>
</ListView>

如果要使用mvvm访问代码隐藏中的数据,可以执行以下操作:

 vm = new YourViewModel(optionalParameter);
 BindingContext = vm;
 yourListView.ItemsSource = theDataYouWantToPersist;

这就是我的工作。如果您需要更多详细信息,请提供更多详细信息和代码。

我希望根据集合中每个对象的数据创建每个BoxView的尺寸(纯图形化,不显示任何信息)。我可以将集合绑定到ListView并将IsVisible=false,但这似乎不正确。您可以尝试绑定到
HeightRequest
WidthRequest
属性,但我不确定它在列表场景中如何工作。您必须将
hasUnderRows
属性设置为
true
。这样做可以正确返回我的ViewModel集合,但是在绘制屏幕后会调用OnBindingContextChanged()方法,因此此时无法添加BoxView。有什么建议吗?如果你知道你的收藏已经满了,你可以走@Idev路。并在代码隐藏构造函数中创建UI。
public partial class MyPage
{
    private MyViewModel _viewModel;
    public MyPage()
    {
        InitializeComponent();
    }

    protected override void OnBindingContextChanged()
    {
        base.OnBindingContextChanged();
        _viewModel = BindingContext as MyViewModel;
        var collection = _viewModel.MyCollection;
    }

}
public partial class MyPage
{
    private MyViewModel _viewModel;
    public MyPage()
    {
        InitializeComponent();
    }

    protected override void OnBindingContextChanged()
    {
        base.OnBindingContextChanged();
        _viewModel = BindingContext as MyViewModel;
        var collection = _viewModel.MyCollection;
    }

}