如何从ViewModel操作视图(XAML)? (Xamarin形式)

时间:2018-12-18 17:27:17

标签: xaml xamarin mvvm xamarin.forms

如何从ViewModel操作视图(XAML)?

例如,我有一个对象的详细视图。视图有一个网格。取决于对象,网格应具有不同的行数和列数。列数和行数在对象详细信息中设置。是否可以通过ViewModel做到这一点,或者我必须在View .cs中做到这一点?

我从ListView(OnItemSelect)打开详细视图:

await Navigation.PushAsync(new AlgoDetailPage(new AlgoDetailViewModel(algo)));

AlgoDetailPage-在这里,我要添加cols和行,具体取决于对象。

<?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>

AlgoDetailPage.cs:

    public partial class AlgoDetailPage : ContentPage
    {
        AlgoDetailViewModel viewModel;

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

        public AlgoDetailPage()
        {
            InitializeComponent();
            BindingContext = viewModel;
        }
    }

ViewModel:

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

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

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

4 个答案:

答案 0 :(得分:1)

您不从VM操作视图。相反,视图应使用VM的属性来确定其布局。在这种情况下,您将根据VM中的数据在视图中添加行和列。

答案 1 :(得分:0)

从技术上讲,您不必从View本身执行此操作。如果您想完全正统,则可以创建将为您处理绑定的自定义控件。就个人而言,我不建议您遵循某些理论,但是如果您愿意的话,这是可能的。

除此之外,您可能会尝试查看将在Xamarin 4.0中显示的CollectionView,它可能与您所要求的接近(您尚未确切指定如何处理列宽)。也可能有一些第三方组件可以处理此问题。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

如果确实需要从ViewModel访问View,则可以将View的Load事件绑定到命令,然后将View本身作为命令参数传递。