[英]Set a Property in a ViewModel from Another ViewModel
我试图在导航到附加到该视图模型的页面之前,将值从另一个视图模型传递给视图模型。 我之前曾将其传递给视图,然后将其传递给视图模型。 这似乎是一种笨拙的处理方式。 我没有使用任何类型的框架,所以这不是一个选择。 目前,该属性已设置为static并且可以正常工作,但我不确定这是否是一种好习惯。 编码:
查看模型1:
此命令将打开新页面:
public void OpenRouteDetails()
{
RouteStopPopOverViewModel.RouteName = "TestRoute";
App.Page.Navigation.PushAsync(new RouteStopPopOverView());
}
查看模型2:(RouteStopPopOverViewModel)
public static string RouteName { get; set; }
这确实有效,但是我不希望使用静态方法来实现此目的。 有什么方法可以设置RouteName属性,而不使用静态属性或通过view-> view model传递它。 我已经看到了一些有关此问题的答案,但他们似乎并没有明确回答问题。
在此示例中,您可以通过导航轻松实现您的要求
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;
}
}
在视图模型之间共享控制器类。
必须在两个视图模型中将相同的实例提供给构造函数。
因此,您可以设置值,并在两个视图模型中侦听事件。
控制器类成为中介。
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
};
}
}
如果存在层次结构,则可以在两个层次结构的父级中表示。
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();
}
}
使用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;
}
}
尽管大多数MVVM框架具有相似的功能,但您可以在此处找到有关FreshMvvm的更多详细信息 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.