我尝试在导航到附加到该视图模型的页面之前,将值传递给另一个视图模型中的视图模型。 我以前将它传递给视图,然后将其传递给视图模型。这似乎是一种笨拙的做事方式。 我没有使用任何类型的框架,所以这不是一个选项。 目前该属性设置为静态,这有效但我不确定这是否是一个好习惯。 代码:
查看模型1:
此命令将打开新页面:
public void OpenRouteDetails()
{
RouteStopPopOverViewModel.RouteName = "TestRoute";
App.Page.Navigation.PushAsync(new RouteStopPopOverView());
}
查看模型2:(RouteStopPopOverViewModel)
public static string RouteName { get; set; }
这确实有效,但我不想使用静态作为实现此目的的方法。 有没有办法设置RouteName属性而不使用静态或通过view->传递它查看模型。 我已经看到了一些关于这方面的答案,但他们似乎没有清楚地回答问题。
答案 0 :(得分:1)
这里是您可以通过导航轻松实现您的要求的示例
public class ViewModelFrom : BaseViewModel
{
async Task ExecuteCommand()
{
string routeName="value to trasfer";
Navigation.PushAsync(new View(routeName));
}
}
public partial class View : ContentPage
{
public View(string routeName)
{
InitializeComponent();
BindingContext = new ViewModelTo(routeName);
}
}
public class ViewModelTo : BaseViewModel
{
public string RouteName { get; set; }
public ViewModelTo(string routeName)
{
RouteName=routeName;
}
}
答案 1 :(得分:1)
在视图模型之间共享控制器类 必须在两个视图模型中为构造函数提供相同的实例 因此,您可以设置值,并在两个视图模型中监听事件 控制器类成为中介。
public class SharedController : IControlSomething
{
private string _sharedValue;
public string SharedValue
{
get => _sharedValue;
set
{
if (_sharedValue == value)
return;
_sharedValue = value;
OnSharedValueUpdated();
}
}
public event EventHandler SharedValueUpdated;
protected virtual void OnSharedValueUpdated()
{
SharedValueUpdated?.Invoke(this, EventArgs.Empty);
}
}
public class ViewModel1
{
private readonly IControlSomething _controller;
public ViewModel1(IControlSomething controller)
{
// Save to access controller values in commands
_controller = controller;
_controller.SharedValueUpdated += (sender, args) =>
{
// Handle value update event
};
}
}
public class ViewModel2
{
private readonly IControlSomething _controller;
public ViewModel2(IControlSomething controller)
{
// Save to access controller values in commands
_controller = controller;
_controller.SharedValueUpdated += (sender, args) =>
{
// Handle value update event
};
}
}
答案 2 :(得分:0)
如果存在层次结构,则可以在父级中表达这两种层次结构。
public class Route
{
private string Name;
}
public class RouteSelectedArgs : EventArgs
{
public Route Selected { get; set; }
}
public interface IRouteSelection
{
event EventHandler<RouteSelectedArgs> RouteSelected;
}
public interface IRouteDetails { }
public class RouteWizard
{
public UserControl view { get; set; }
private IRouteSelection _selection;
private IRouteDetails _details;
public RouteWizard(IRouteSelection selection, IRouteDetails details)
{
_selection = selection;
_details = details;
_selection.RouteSelected += Selection_RouteSelected;
view = MakeView(_selection);
}
private void Selection_RouteSelected(object sender, RouteSelectedArgs e)
{
_selection.RouteSelected -= Selection_RouteSelected;
view = MakeView(_details, e.Selected);
}
private UserControl MakeView(params object[] args)
{
////magic
throw new NotImplementedException();
}
}
答案 3 :(得分:0)
当您使用MVVM模式时,您可以使用众多MVVM框架中的一个来实现此目的。
我使用FreshMvvm,它允许我在视图模型之间传递参数,如
await CoreMethods.PushPageModel<SecondPageModel>(myParameter, false);
然后在SecondPageModel中,我可以看到访问Init方法中的参数
private MyParamType _myParameter;
public override void Init(object initData)
{
base.Init(initData);
var param = initData as MyParamType;
if (param != null)
{
_myParameter = param;
}
}
You can find more details about FreshMvvm here虽然大多数MVVM框架都具有类似的功能。