Xaml 表单ViewModelLocator会被调用两次

Xaml 表单ViewModelLocator会被调用两次,xaml,xamarin,xamarin.forms,Xaml,Xamarin,Xamarin.forms,XAML: 视图定位器: public App() { InitializeComponent(); var locator = new ViewLocator(); Current.Resources.Add("Locator", locator); MainPage = new mvvmtestPage(); } TestViewModel: public class ViewLocator { public TestViewModel Test

XAML:

视图定位器:

public App()
{
    InitializeComponent();

    var locator = new ViewLocator();
    Current.Resources.Add("Locator", locator);

    MainPage = new mvvmtestPage();
}
TestViewModel:

public class ViewLocator
{
    public TestViewModel TestViewModel
    {
        get { return new TestViewModel(); }
    }
}
想知道为什么TesViewModel构造函数被调用了两次

调用堆栈:

public class TestViewModel
{

    public static int InstancesNum = 0;

    public TestViewModel()
    {
        Debug.WriteLine(++InstancesNum);
    }
}
mvvmtest.ViewLocator.get_TestViewModel()位于/Users/xxx/Projects/mvvmtest/mvvmtest/ViewLocator.cs:8
中的System.Reflection.MonoMethod.InternalInvoke()
C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Core\BindingExpression.cs:565中的Xamarin.Forms.BindingExpression.BindingExpressionPart.TryGetValue(mvvmtest.ViewLocator源,mvvmtest.ViewLocator值)
C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Core\BindingExpression.cs:160
C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Core\BindingExpression.cs:76中的Xamarin.Forms.BindingExpression.Apply(mvvmtest.ViewLocator源对象、mvvmtest.mvvmtestPage目标、Xamarin.Forms.bindingProperty属性)
C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Binding.Apply(对象newContext,mvvmtest.mvvmtestPage bindObj,Xamarin.Forms.BindableProperty targetProperty)中的
C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Core\BindableObject.cs:281中的Xamarin.Forms.BindableObject.SetBinding(Xamarin.Forms.BindableProperty targetProperty,Xamarin.Forms.Binding绑定,bool fromStyle)
C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Core\BindableObject.cs:78中的Xamarin.Forms.BindableObject.SetBinding(Xamarin.Forms.BindableProperty targetProperty,Xamarin.Forms.Binding绑定)
C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.BindableProperty属性,字符串localName,Xamarin.Forms.Binding值,Xamarin.Forms.Xaml.ElementNode lineInfo,System.Exception异常)中的Xamarin.Forms.Xaml.applypropertiesvister.TrySetBinding(mvvmtest.mvvmtestPage元素,Xamarin.Forms.Binding属性,字符串localName,Xamarin.Forms.Binding值,Xamarin.Forms.Xaml.ElementNode lineInfo,System.Exception异常异常)
Xamarin.Forms.Xaml.ApplyPropertiesVisitor.SetPropertyValue(mvvmtest.mvvmtestPage xamlelement,Xamarin.Forms.Xaml.XmlName propertyName,Xamarin.Forms.Binding值,mvvmtest.mvvmtestPage根元素,Xamarin.Forms.Xaml.ElementNode节点,Xamarin.Forms.Xaml.HyderationContext上下文,Xamarin.Forms.Xaml.ElementNode lineInfo)在C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Xaml\applypropertiesvister.cs:290中
C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Xaml.ElementNode节点,Xamarin.Forms.Xaml.XamlLoader.RuntimeRootNode parentNode)中的Xamarin.Forms.Xaml.ApplyPropertiesVisitor.vision(Xamarin.Forms.Xaml.ElementNode,Xamarin.Forms.XamlLoader.RuntimeRootNode-parentNode)访问
C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Xaml.ApplyPropertiesVisitor,Xamarin.Forms.Xaml.XamlLoader.RuntimeRootNode parentNode)中的Xamarin.Forms.Xaml.ElementNode.Accept
C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Xaml.ApplyPropertiesVisitor(Xamarin.Forms.Xaml.ApplyPropertiesVisitor,Xamarin.Forms.Xaml.INode parentNode)中的Xamarin.Forms.Xaml.RootNode.Accept
访问C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Xaml.XamlLoader.RuntimeRootNode rootnode,Xamarin.Forms.Xaml.hydrationcontext visitorContext)中的Xamarin.Forms.Xaml.Xaml.XamlLoader
C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Xaml.XamlLoader.Load(mvvmtest.mvvmtestPage视图,字符串Xaml)中的
C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Xaml.XamlLoader.Load(mvvmtest.mvvmtestPage视图,System.RuntimeType callingType)中的
C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Xaml.Extensions.LoadFromXaml(mvvmtest.mvvmtestPage视图,System.RuntimeType callingType)中的
mvvmtest.mvvmtestPage.InitializeComponent()位于/Users/xxx/Projects/mvvmtest/mvvmtest/obj/Debug/mvvmtest.mvvmtestPage.xaml.g.cs:21
mvvmtest.mvvmtestPage..ctor()位于/Users/xxx/Projects/mvvmtest/mvvmtest/mvvmtestPage.xaml.cs:10
mvvmtest.App..ctor()位于/Users/xxx/Projects/mvvmtest/mvvmtest/App.xaml.cs:14
MVVMest.Ipp.AppDeAT.FixISDebug(UIKIT.UIAPP应用程序,基础.NS字典选项)//XXX/Studio/MVVMtest/iOS/AppDealt.cs:17
中的UIKit.UIApplication.UIApplicationMain()
UIKit.UIApplication.Main(字符串[]参数,System.IntPtr主体,System.IntPtr委托)位于/Users/builder/data/lanes/3985/62816dd6/source/xamarin macios/src/UIKit/UIApplication.cs:79
/Users/builder/data/lanes/3985/62816dd6/source/xamarin macios/src/UIKit/UIApplication.Main(字符串[]参数,字符串principalClassName,字符串delegateClassName)中的
/Users/xxx/Projects/mvvmtest/iOS/Main.cs:17中的mvvmtest.iOS.Application.Main(字符串[]args)
mvvmtest.ViewLocator.get_TestViewModel()位于/Users/xxx/Projects/mvvmtest/mvvmtest/ViewLocator.cs:8
中的System.Reflection.MonoMethod.InternalInvoke()
C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Core\BindingExpression.cs:565中的Xamarin.Forms.BindingExpression.BindingExpressionPart.TryGetValue(mvvmtest.ViewLocator源,mvvmtest.ViewLocator值)
C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Core\BindingExpression.cs:160
C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Core\BindingExpression.cs:76中的Xamarin.Forms.BindingExpression.Apply(mvvmtest.ViewLocator源对象、mvvmtest.mvvmtestPage目标、Xamarin.Forms.bindingProperty属性)
C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Core\Binding.cs:122中的Xamarin.Forms.Binding.Apply(mvvmtest.TestViewModel newContext、mvvmtest.mvvmtestPage bindObj、Xamarin.Forms.BindableProperty targetProperty)
C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Core\BindableObject.cs:408中的Xamarin.Forms.BindableObject.ApplyBindings(mvvmtest.TestViewModel oldContext,bool skipBindingContext)
Xamarin.Forms.BindableObject.ApplyBind
public class TestViewModel
{

    public static int InstancesNum = 0;

    public TestViewModel()
    {
        Debug.WriteLine(++InstancesNum);
    }
}
mvvmtest.ViewLocator.get_TestViewModel() in /Users/xxx/Projects/mvvmtest/mvvmtest/ViewLocator.cs:8
System.Reflection.MonoMethod.InternalInvoke() in 
Xamarin.Forms.BindingExpression.BindingExpressionPart.TryGetValue(mvvmtest.ViewLocator source, mvvmtest.ViewLocator value) in C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Core\BindingExpression.cs:565
Xamarin.Forms.BindingExpression.ApplyCore(mvvmtest.ViewLocator sourceObject, mvvmtest.mvvmtestPage target, Xamarin.Forms.BindableProperty property, bool fromTarget) in C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Core\BindingExpression.cs:160
Xamarin.Forms.BindingExpression.Apply(mvvmtest.ViewLocator sourceObject, mvvmtest.mvvmtestPage target, Xamarin.Forms.BindableProperty property) in C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Core\BindingExpression.cs:76
Xamarin.Forms.Binding.Apply(object newContext, mvvmtest.mvvmtestPage bindObj, Xamarin.Forms.BindableProperty targetProperty) in C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Core\Binding.cs:122
Xamarin.Forms.BindableObject.SetBinding(Xamarin.Forms.BindableProperty targetProperty, Xamarin.Forms.Binding binding, bool fromStyle) in C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Core\BindableObject.cs:281
Xamarin.Forms.BindableObject.SetBinding(Xamarin.Forms.BindableProperty targetProperty, Xamarin.Forms.Binding binding) in C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Core\BindableObject.cs:78
Xamarin.Forms.Xaml.ApplyPropertiesVisitor.TrySetBinding(mvvmtest.mvvmtestPage element, Xamarin.Forms.BindableProperty property, string localName, Xamarin.Forms.Binding value, Xamarin.Forms.Xaml.ElementNode lineInfo, System.Exception exception) in C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Xaml\ApplyPropertiesVisitor.cs:371
Xamarin.Forms.Xaml.ApplyPropertiesVisitor.SetPropertyValue(mvvmtest.mvvmtestPage xamlelement, Xamarin.Forms.Xaml.XmlName propertyName, Xamarin.Forms.Binding value, mvvmtest.mvvmtestPage rootElement, Xamarin.Forms.Xaml.ElementNode node, Xamarin.Forms.Xaml.HydratationContext context, Xamarin.Forms.Xaml.ElementNode lineInfo) in C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Xaml\ApplyPropertiesVisitor.cs:290
Xamarin.Forms.Xaml.ApplyPropertiesVisitor.Visit(Xamarin.Forms.Xaml.ElementNode node, Xamarin.Forms.Xaml.XamlLoader.RuntimeRootNode parentNode) in C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Xaml\ApplyPropertiesVisitor.cs:119
Xamarin.Forms.Xaml.ElementNode.Accept(Xamarin.Forms.Xaml.ApplyPropertiesVisitor visitor, Xamarin.Forms.Xaml.XamlLoader.RuntimeRootNode parentNode) in C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Xaml\XamlNode.cs:176
Xamarin.Forms.Xaml.RootNode.Accept(Xamarin.Forms.Xaml.ApplyPropertiesVisitor visitor, Xamarin.Forms.Xaml.INode parentNode) in C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Xaml\XamlNode.cs:224
Xamarin.Forms.Xaml.XamlLoader.Visit(Xamarin.Forms.Xaml.XamlLoader.RuntimeRootNode rootnode, Xamarin.Forms.Xaml.HydratationContext visitorContext) in C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Xaml\XamlLoader.cs:125
Xamarin.Forms.Xaml.XamlLoader.Load(mvvmtest.mvvmtestPage view, string xaml) in C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Xaml\XamlLoader.cs:76
Xamarin.Forms.Xaml.XamlLoader.Load(mvvmtest.mvvmtestPage view, System.RuntimeType callingType) in C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Xaml\XamlLoader.cs:56
Xamarin.Forms.Xaml.Extensions.LoadFromXaml<mvvmtest.mvvmtestPage>(mvvmtest.mvvmtestPage view, System.RuntimeType callingType) in C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Xaml\ViewExtensions.cs:36
mvvmtest.mvvmtestPage.InitializeComponent() in /Users/xxx/Projects/mvvmtest/mvvmtest/obj/Debug/mvvmtest.mvvmtestPage.xaml.g.cs:21
mvvmtest.mvvmtestPage..ctor() in /Users/xxx/Projects/mvvmtest/mvvmtest/mvvmtestPage.xaml.cs:10
mvvmtest.App..ctor() in /Users/xxx/Projects/mvvmtest/mvvmtest/App.xaml.cs:14
mvvmtest.iOS.AppDelegate.FinishedLaunching(UIKit.UIApplication app, Foundation.NSDictionary options) in /Users/xxx/Projects/mvvmtest/iOS/AppDelegate.cs:17
UIKit.UIApplication.UIApplicationMain() in 
UIKit.UIApplication.Main(string[] args, System.IntPtr principal, System.IntPtr delegate) in /Users/builder/data/lanes/3985/62816dd6/source/xamarin-macios/src/UIKit/UIApplication.cs:79
UIKit.UIApplication.Main(string[] args, string principalClassName, string delegateClassName) in /Users/builder/data/lanes/3985/62816dd6/source/xamarin-macios/src/UIKit/UIApplication.cs:63
mvvmtest.iOS.Application.Main(string[] args) in /Users/xxx/Projects/mvvmtest/iOS/Main.cs:17

mvvmtest.ViewLocator.get_TestViewModel() in /Users/xxx/Projects/mvvmtest/mvvmtest/ViewLocator.cs:8
System.Reflection.MonoMethod.InternalInvoke() in 
Xamarin.Forms.BindingExpression.BindingExpressionPart.TryGetValue(mvvmtest.ViewLocator source, mvvmtest.ViewLocator value) in C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Core\BindingExpression.cs:565
Xamarin.Forms.BindingExpression.ApplyCore(mvvmtest.ViewLocator sourceObject, mvvmtest.mvvmtestPage target, Xamarin.Forms.BindableProperty property, bool fromTarget) in C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Core\BindingExpression.cs:160
Xamarin.Forms.BindingExpression.Apply(mvvmtest.ViewLocator sourceObject, mvvmtest.mvvmtestPage target, Xamarin.Forms.BindableProperty property) in C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Core\BindingExpression.cs:76
Xamarin.Forms.Binding.Apply(mvvmtest.TestViewModel newContext, mvvmtest.mvvmtestPage bindObj, Xamarin.Forms.BindableProperty targetProperty) in C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Core\Binding.cs:122
Xamarin.Forms.BindableObject.ApplyBindings(mvvmtest.TestViewModel oldContext, bool skipBindingContext) in C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Core\BindableObject.cs:408
Xamarin.Forms.BindableObject.ApplyBindings(mvvmtest.TestViewModel oldContext) in C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Core\BindableObject.cs:123
Xamarin.Forms.BindableObject.SetInheritedBindingContext(mvvmtest.mvvmtestPage bindable, object value) in C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Core\BindableObject.cs:117
Xamarin.Forms.Element.SetChildInheritedBindingContext(mvvmtest.mvvmtestPage child, object context) in C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Core\Element.cs:482
Xamarin.Forms.Element.set_Parent(mvvmtest.App value) in C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Core\Element.cs:196
Xamarin.Forms.Application.set_MainPage(mvvmtest.mvvmtestPage value) in C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Core\Application.cs:86
mvvmtest.App..ctor() in /Users/xxx/Projects/mvvmtest/mvvmtest/App.xaml.cs:14
mvvmtest.iOS.AppDelegate.FinishedLaunching(UIKit.UIApplication app, Foundation.NSDictionary options) in /Users/xxx/Projects/mvvmtest/iOS/AppDelegate.cs:17
UIKit.UIApplication.UIApplicationMain() in 
UIKit.UIApplication.Main(string[] args, System.IntPtr principal, System.IntPtr delegate) in /Users/builder/data/lanes/3985/62816dd6/source/xamarin-macios/src/UIKit/UIApplication.cs:79
UIKit.UIApplication.Main(string[] args, string principalClassName, string delegateClassName) in /Users/builder/data/lanes/3985/62816dd6/source/xamarin-macios/src/UIKit/UIApplication.cs:63
mvvmtest.iOS.Application.Main(string[] args) in /Users/xxx/Projects/mvvmtest/iOS/Main.cs:17
<ContentPage.BindingContext>
    <local:TestViewModel />
</ContentPage.BindingContext>