如何从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
}
}
答案 0 :(得分:1)
您不从VM操作视图。相反,视图应使用VM的属性来确定其布局。在这种情况下,您将根据VM中的数据在视图中添加行和列。
答案 1 :(得分:0)
从技术上讲,您不必从View本身执行此操作。如果您想完全正统,则可以创建将为您处理绑定的自定义控件。就个人而言,我不建议您遵循某些理论,但是如果您愿意的话,这是可能的。
除此之外,您可能会尝试查看将在Xamarin 4.0中显示的CollectionView,它可能与您所要求的接近(您尚未确切指定如何处理列宽)。也可能有一些第三方组件可以处理此问题。
答案 2 :(得分:0)
如果它是一个复杂的网格,则具有两个不同的内容视图。在您的xaml中,根据条件显示或隐藏内容视图。这样,您可以随时使代码易于管理。
答案 3 :(得分:0)
如果确实需要从ViewModel访问View,则可以将View的Load事件绑定到命令,然后将View本身作为命令参数传递。