0

我正在尝试将 MVVM 与我的 windows phone 7 应用程序一起使用。我对如何做到这一点有点困惑。

我有一个用于在 Web 浏览器中导航的代码隐藏事件。现在,此事件最终将调用一个方法,该方法将使用户使用 Google oAuth 登录。

现在调用 Google 登录方法的代码在我的服务层中。我不确定是否应该在我的 VM 中创建一个调用我的服务层的属性,或者我是否应该直接在我的代码隐藏页面中创建一个服务层对象并直接调用它。

最好的方法是什么?

编辑

这是我所做的

// 后面的代码

   private void wbGoogle_Navigating(object sender, NavigatingEventArgs e)
        {
            var queryParmas = e.Uri.ParseQueryString();

            var code = queryParmas.ToList().Where(x => x.Key == "code").FirstOrDefault();

            if (!code.Equals(new KeyValuePair<string, string>()))
            {
                loginVm.AuthenticateUser(code.Value, TestCallBack);
            }
        }

 private void TestCallBack(Authorization a)
        {
            var d = a;
            // maybe assign "a" to some property back in the VM.
        }

// 虚拟机

public void AuthenticateUser(string code, Action<GoogleContacts.Model.Authorization> CallbackOnSuccess)
    {
        loginService.SendCode(code, CallbackOnSuccess);
    }

//服务层

  public void SendCode(string code, Action<Authorization> CallbackOnSuccess)
        {
            var request = new RestRequest(TokenEndPoint, Method.POST);
            request.AddParameter("code", code);
            request.AddParameter("client_id", ClientId);
            request.AddParameter("client_secret", SecretKey);
            request.AddParameter("grant_type", GrantType);
            request.AddParameter("redirect_uri", RedirectUrl);

            client.ExecuteAsync<Authorization>(request, response =>
            {
                CallbackOnSuccess(response.Data);
            });

        }
4

2 回答 2

0

视图模型是您的视图模型——它是您所有逻辑工作实际完成的地方。View 的职责是向 UI 呈现信息并收集用户输入。视图执行的任何其他任务都开始与您的代码库紧密耦合,最终您将面临维护的噩梦。

要直接回答您的问题,您的视图(代码隐藏)应该将 UI 元素已被单击的事实传递给视图模型中的方法(命令绑定或其他机制)。

然后,您的 Veiw Model 决定下一步该做什么。它可能决定导航到特定网页的时间,此时它会向视图发出信号以移动到请求的页面。

ViewModel 和 View 通信的精确方法与您使用的框架有很大关系,以及您是“ViewModel First”还是“View First”那种人。

于 2013-03-12T18:17:14.500 回答
0

为了简单起见……视图模型是您的业务逻辑和应用程序的大脑。视图应该只处理数据的显示。我会考虑“大脑”的身份验证部分,并将其放在您的视图模型中的某个地方。您甚至可能会变得更复杂(取决于您的应用程序的需要)并将身份验证登录方法放在您的视图模型的基类中。这样,如果需要,可以通过任何页面访问登录调用。

将它放在您的代码后面只是将该代码与您的视图紧密耦合 - 使其不太可重用。如果你想要最好的架构,我会避免这种情况。可以将内容放在视图后面的代码中。

我强烈不同意 MVVM 存在以避免代码落后的评论。我使用的经验法则是:视图代码隐藏的目的是否仅支持视图/显示功能?(也许您需要编写代码来制作动画或更改数据模板 - 从而更改其显示)。逻辑背后的代码应该是特定于显示的。因此,根据这条规则,登录不是特定于显示的,也不应该是代码隐藏方法。

我的 2 美分

于 2013-03-12T18:17:53.960 回答