如何从ViewModel操作视图(XAML)?(沙马林表格)

如何从ViewModel操作视图(XAML)?(沙马林表格),xaml,xamarin,mvvm,xamarin.forms,Xaml,Xamarin,Mvvm,Xamarin.forms,如何从ViewModel操作视图(XAML) 例如,我有一个对象的详细视图。视图有一个网格。根据对象的不同,网格的行数和列数应该不同。列数和行数在对象详细信息中设置。是否可以从ViewModel中执行此操作,或者我必须在View.cs中执行此操作 我从ListView(OnItemSelect)打开局部视图: AlgoDetailPage-这里我想添加列和行,具体取决于对象 <?xml version="1.0" encoding="utf-8" ?> <ContentPage

如何从ViewModel操作视图(XAML)

例如,我有一个对象的详细视图。视图有一个网格。根据对象的不同,网格的行数和列数应该不同。列数和行数在对象详细信息中设置。是否可以从ViewModel中执行此操作,或者我必须在View.cs中执行此操作

我从ListView(OnItemSelect)打开局部视图:

AlgoDetailPage-这里我想添加列和行,具体取决于对象

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="NotsanHessen.Views.AlgoDetailPage"
             Title="{Binding Algo.Title}">
    <StackLayout>
        <Grid>

        </Grid>
    </StackLayout>
</ContentPage>
ViewModel:

public class AlgoDetailViewModel : BaseViewModel
{
    public Algo Algo { get; set; }

    public AlgoDetailViewModel(Algo algo = null)
    {
        this.Algo = algo;

        // Rows: algo.Rows
        // Cols: algoCols
    }
}

从技术上讲,您不必从视图本身进行操作。如果希望完全正统,可以创建自定义控件来为您处理绑定。就我个人而言,我不建议遵循某种理论,但如果你愿意,这是可能的


除此之外,您可以尝试查看将出现在Xamarin 4.0中的CollectionView,它可能接近您所要求的内容(您还没有确切指定如何处理列宽)。还有一些第三方组件可以处理这个问题。

您不需要从VM操作视图。相反,视图应该使用VM的属性来确定其布局。在本例中,您将根据来自VM的数据在视图中添加行和列

如果它是一个复杂的网格,则有两个不同的内容视图。在xaml中,根据条件显示或隐藏内容视图。通过这种方式,您可以随时管理代码。

如果确实需要从ViewModel访问视图,您可以将视图的加载事件绑定到命令,并将视图本身作为命令参数传递。

您不需要从VM操作视图。相反,视图应该使用VM的属性来确定其布局。在这种情况下,您将根据VM中的数据在视图中添加行和列。@Jason您的提示将告诉我正确的方法,当您将其发布为答案时,我会将其标记为解决方案。
    public partial class AlgoDetailPage : ContentPage
    {
        AlgoDetailViewModel viewModel;

        public AlgoDetailPage(AlgoDetailViewModel viewModel)
        {
            InitializeComponent();
            BindingContext = this.viewModel = viewModel;
        }

        public AlgoDetailPage()
        {
            InitializeComponent();
            BindingContext = viewModel;
        }
    }
public class AlgoDetailViewModel : BaseViewModel
{
    public Algo Algo { get; set; }

    public AlgoDetailViewModel(Algo algo = null)
    {
        this.Algo = algo;

        // Rows: algo.Rows
        // Cols: algoCols
    }
}