mvvmcross 是否有用于 viewmodel 的内置消息以告知视图何时发生 ViewAppearing/Disappearing?
Does mvvmcross have a built-in message for viewmodel to tell view when ViewAppearing/Disappearing happen?
我有逻辑要在 Xamarin.Forms ContentView(不是页面)中执行,当它出现和消失时。这是一个 mvvmcross 内容视图:
public partial class MyContentView : MvxContentView
我希望这是一个普遍的需求,但我没有为此找到内置的 mvvmcross 方法调用或覆盖。有吗? [关于将这些添加到 Xamarin.Forms 本身进行了多年的讨论,但从未实施过。我希望 mvvmcross 为视图解决这个问题,就像他们为他们的视图模型所做的那样。]
注意:我知道有多种方法可以自己滚动;但这肯定是基本的;内置?
为完整起见,以下是我知道的替代方案:
- “出现”我可以通过
override OnViewModelSet
进行足够的近似。但是我没有看到视图消失的相应覆盖。
- 在
OnViewModelSet
,可以挂一个Binding Set and a Binding or two。利用 MvxViewModel 的生命周期事件。 这是我目前的计划;将添加到我的 BaseView
class。所以我的继承层次结构变成 MyContentView
: BaseView
: MvxContentView
.
MvxMessaging
(或Xamarin.Forms 消息中心)。
所以有很多选择。我只是觉得我一定是忽略了一些东西,因为这似乎是一种普遍的、标准的、需要的。毕竟,每个平台都有自己的视图生命周期方法。而 mvvmcross 有相应的 viewmodel 生命周期方法。我只是想让跨平台 Xamarin.Forms 视图具有相同的生命周期方法 - 而无需发明我自己的解决方案。
不,我们不会在 ViewModel 更改时或生命周期更改时发布任何消息。
我们的 ViewModel 具有生命周期感知能力,您可以在其中覆盖 ViewModel 中的 OnViewAppeared、OnViewDisappeared 等。要完成这些工作,您需要使用 Activity/Fragment/ViewController 的 MvvmCross 变体,如果您将 ViewModel 分配给自定义控件,则需要自己调用这些方法。
到目前为止我找到的最简洁(对于 View
)解决方案是在我的基础 MvxViewModel
中添加一个标准的 c# EventHandler。一个 属性 随着视图模型的出现和消失而切换。 属性 的 setter 调用事件处理程序。
视图模型:
public class BaseViewModel : MvxViewModel
{
// ...
public event EventHandler<BoolEventArgs> AppearingStateEvent;
private bool _AppearingState;
public bool AppearingState
{
get => _AppearingState;
set
{
SetProperty(ref _AppearingState, value);
AppearingStateEvent?.Invoke(this, new BoolEventArgs(value));
}
}
public override void ViewAppearing()
{
base.ViewAppearing();
AppearingState = true;
}
public override void ViewDisappearing()
{
AppearingState=false;
base.ViewDisappearing();
}
}
使用 class:
public class BoolEventArgs : EventArgs
{
public bool Value;
public BoolEventArgs(bool value)
{
Value = value;
}
}
查看:
public class BaseContentView : MvxContentView
{
// ...
protected override void OnBindingContextChanged()
{
base.OnBindingContextChanged();
if (ViewModel is BaseViewModel vm)
{
// Remove old, in case we get here twice. Avoids duplicate events.
vm.AppearingStateEvent -= Vm_AppearingStateEvent;
vm.AppearingStateEvent += Vm_AppearingStateEvent;
}
}
protected virtual void Vm_AppearingStateEvent(object sender, BoolEventArgs e)
{
bool appearingState = e.Value;
// ...
}
}
视图子classes 可以覆盖 Vm_AppearingStateEvent,以在视图出现或消失时执行操作。
我有逻辑要在 Xamarin.Forms ContentView(不是页面)中执行,当它出现和消失时。这是一个 mvvmcross 内容视图:
public partial class MyContentView : MvxContentView
我希望这是一个普遍的需求,但我没有为此找到内置的 mvvmcross 方法调用或覆盖。有吗? [关于将这些添加到 Xamarin.Forms 本身进行了多年的讨论,但从未实施过。我希望 mvvmcross 为视图解决这个问题,就像他们为他们的视图模型所做的那样。]
注意:我知道有多种方法可以自己滚动;但这肯定是基本的;内置?
为完整起见,以下是我知道的替代方案:
- “出现”我可以通过
override OnViewModelSet
进行足够的近似。但是我没有看到视图消失的相应覆盖。 - 在
OnViewModelSet
,可以挂一个Binding Set and a Binding or two。利用 MvxViewModel 的生命周期事件。 这是我目前的计划;将添加到我的BaseView
class。所以我的继承层次结构变成MyContentView
:BaseView
:MvxContentView
. MvxMessaging
(或Xamarin.Forms 消息中心)。
所以有很多选择。我只是觉得我一定是忽略了一些东西,因为这似乎是一种普遍的、标准的、需要的。毕竟,每个平台都有自己的视图生命周期方法。而 mvvmcross 有相应的 viewmodel 生命周期方法。我只是想让跨平台 Xamarin.Forms 视图具有相同的生命周期方法 - 而无需发明我自己的解决方案。
不,我们不会在 ViewModel 更改时或生命周期更改时发布任何消息。
我们的 ViewModel 具有生命周期感知能力,您可以在其中覆盖 ViewModel 中的 OnViewAppeared、OnViewDisappeared 等。要完成这些工作,您需要使用 Activity/Fragment/ViewController 的 MvvmCross 变体,如果您将 ViewModel 分配给自定义控件,则需要自己调用这些方法。
到目前为止我找到的最简洁(对于 View
)解决方案是在我的基础 MvxViewModel
中添加一个标准的 c# EventHandler。一个 属性 随着视图模型的出现和消失而切换。 属性 的 setter 调用事件处理程序。
视图模型:
public class BaseViewModel : MvxViewModel
{
// ...
public event EventHandler<BoolEventArgs> AppearingStateEvent;
private bool _AppearingState;
public bool AppearingState
{
get => _AppearingState;
set
{
SetProperty(ref _AppearingState, value);
AppearingStateEvent?.Invoke(this, new BoolEventArgs(value));
}
}
public override void ViewAppearing()
{
base.ViewAppearing();
AppearingState = true;
}
public override void ViewDisappearing()
{
AppearingState=false;
base.ViewDisappearing();
}
}
使用 class:
public class BoolEventArgs : EventArgs
{
public bool Value;
public BoolEventArgs(bool value)
{
Value = value;
}
}
查看:
public class BaseContentView : MvxContentView
{
// ...
protected override void OnBindingContextChanged()
{
base.OnBindingContextChanged();
if (ViewModel is BaseViewModel vm)
{
// Remove old, in case we get here twice. Avoids duplicate events.
vm.AppearingStateEvent -= Vm_AppearingStateEvent;
vm.AppearingStateEvent += Vm_AppearingStateEvent;
}
}
protected virtual void Vm_AppearingStateEvent(object sender, BoolEventArgs e)
{
bool appearingState = e.Value;
// ...
}
}
视图子classes 可以覆盖 Vm_AppearingStateEvent,以在视图出现或消失时执行操作。