【问题标题】:How to pass a parameter to the viewmodel of the navigated page without mvvm light如何在没有 mvvm light 的情况下将参数传递给导航页面的视图模型
【发布时间】:2020-12-22 18:16:38
【问题描述】:

我想将参数“Trip”传递给导航页面的视图模型。到目前为止,我有这个: 我将从中导航的页面的代码。这是一次旅行的翻转

public sealed partial class TripOverview : Page
{
    public TripOverview()
    {
        
        this.InitializeComponent();
        DataContext = new TripOverviewViewmodel();

    }
    public void Trip_Detail(object sender, RoutedEventArgs e)
    {
        Trip selectedTrip = (Trip)TripFlip.SelectedItem;
        
        this.Frame.Navigate(typeof(TripDetail), selectedTrip);
        
    }
    
}

这是我的旅行详情页面。我想将从 onNavigatedTo 方法获得的参数添加到视图模型中,然后链接到 Datacontext。

public sealed partial class TripDetail : Page
   
{
    public Trip selectedTrip { get; set; }
    public TripDetailViewmodel vm = new TripDetailViewmodel();
    
    public TripDetail()
    {
        
        this.InitializeComponent();

        this.DataContext = vm;
       


    }
    protected override void OnNavigatedTo(NavigationEventArgs e)
    {
        Trip trip = (Trip)e.Parameter;
        
        
        
        base.OnNavigatedTo(e);
    }




}

所以基本上我想要我的视图模型中的“currentTrip”属性:

 public class TripDetailViewmodel
{

    public Trip CurrentTrip { get; set; }
    public TripDetailViewmodel()
    {
       
    }
    
   
}

在不使用 mvvm light 的情况下进行设置

这是我的 TripDetail 页面的 XAML

<Page
x:Class="TravelChecker.TripDetail"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:TravelChecker"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:viewmodel="using:TravelChecker.Viewmod"
mc:Ignorable="d"
Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<Page.DataContext>
    <viewmodel:TripDetailViewmodel x:Name="tripsDetailVm" />
</Page.DataContext>

<Grid>
    <TextBlock x:Name="title" Text="{x:Bind tripsDetailVm.CurrentTrip.Destination.LocationName}"
                           FontFamily="Segoe UI" FontSize="26.667" 
                           Foreground="Black" Padding="15,20" RenderTransformOrigin="0.318,0.392" />
    <TextBox Text="{Binding ElementName=title, Path=Text, Mode=TwoWay}" x:Name="titletxt">
        
    </TextBox>
    
</Grid>

【问题讨论】:

  • 您可以为此页面发布您的 XAML 吗?为了设置它,您需要将视图模型设为属性(而不是字段)并在 XAML 中设置绑定。
  • 你能告诉我MVVM light是指MVVM Light Toolkit吗?您可以尝试在 TripDetail 页面的 OnNavigatedTo 中添加代码 vm.CurrentTrip = trip;。如果代码符合您的要求,请告诉我。
  • 我会用 XAML 更新帖子。
  • 添加该行不起作用,因为 onnavigatedto 被调用晚了。它首先构建页面,然后初始化虚拟机。我想在创建页面之前初始化 vm,或者至少在之后刷新页面

标签: c# uwp


【解决方案1】:

当您使用{x:Bind} 实现数据绑定时,默认来源是页面而不是DataContext{x:Bind} 将在页面的代码隐藏中查找属性、字段和方法。要将您的视图模型公开给 {x:Bind},您通常需要在页面背后的代码中添加新字段或属性。

但是如果你使用{Binding}来实现数据绑定,{Binding}就需要DataContext

因此,您可以选择在 XAML 的 Page.DataContext 标记中创建的 tripsDetailVm 或在代码后面创建的 vm 作为绑定源。但是,无论您选择哪种绑定源,您都需要将CurrentTrip 属性设置为trip

当你使用tripsDetailVm作为DataContext时,你需要将代码tripsDetailVm.CurrentTrip = trip;添加到OnNavigatedTo方法中。那么{x:Bind}可以在页面中找到tripsDetailVm.CurrentTrip.Destination.LocationName{Binding}可以在DataContext中找到title(即tripsDetailVm)。虽然vm的初始化晚于页面构建的时间,但没关系。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-07
    • 2018-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多