【问题标题】:How to get the callback to viewmodel from library如何从库中获取对 viewmodel 的回调
【发布时间】:2013-10-25 15:31:25
【问题描述】:

我在视图(Home.xaml)中有一个 UIControl(LatestHeadline)(同一页面上还有大约 10 个控件),它是一个文本块。我想在用户单击按钮时设置此控件的文本(名为“Retrieve”)从同一个视图。我必须从我的视图模型中调用实用程序库中的方法。实用程序库中的方法(GetLatestHeadline)通过 webclient 类连接到 Web api,并触发(委托)方法 Retrieve_Completed 事件.

此事件完成后,将从 eventargs 参数 e 中检索所需的数据。现在我想从实用程序库中将数据返回到视图模型,以便我可以将其绑定到 LatestHeadline 文本块。

LatestHeadline 文本块已绑定到视图模型中定义的属性(名为“PropHeadLine”)。 有没有办法在 C#.Net 中实现这一点?

【问题讨论】:

    标签: c# wpf windows-phone-7 mvvm


    【解决方案1】:

    如果您可以从视图模型访问实用程序类,那么您当然可以在视图模型中为您的Retrieve_Completeddelegate 添加一个处理程序。

    utilityClass.Retrieve_Completed += UtilityClassRetrieve_Completed;
    utilityClass.GetLatestHeadline();
    
    ...
    
    public void UtilityClassRetrieve_Completed(EventArgs e)
    {
        // Do something with your e.New value here in the view model
        LatestHeadlineProperty = e.New;
    }
    

    当然,我只是猜测您的Retrieve_Completed 定义在这里,但希望您能明白。

    【讨论】:

    • 对不起,我没有提到它。 LatestHeadline 绑定到 ViewModel 中定义的属性。
    • 我相应地更新了我的答案。这个建议对你有用吗?
    【解决方案2】:

    我喜欢这种事情的“回调”概念——特别是,将一个Action<string> 从视图模型传递给服务。然后服务可以保存对回调的引用,或者将其传递给“UserState”中的完成处理程序。因此,实用程序方法看起来像这样:

    public void GetLatestHeadline(Action<string> callback)
    {
        _apiClient.Retrieve(userState: callback);
    }
    
    private void Retrieve_Completed(object sender, RetrieveCompletedEventArgs args)
    {
        var callback = args.UserState as Action<string>;
        if (callback != null)
            callback(args.Result.Headline);
    }
    

    现在视图模型可以将回调传递给实用程序方法——回调应该只是将属性“PropHeadLine”设置为结果值:

    private void Button_Click()
    {
        Utilities.GetLatestHeadline( result => PropHeadLine = result );
    }
    

    【讨论】:

    • 我正在使用 WebClient 从 API 访问数据,并且我总是使用 DownloadStringCompletedEventArgs e.将 e.UserSTate 设为 null。
    【解决方案3】:
    1. 在您的服务中公开一个委托或事件,在您的视图模型中只需订阅或挂钩 该委托或事件

    2. 当你想通知视图模型 完成特定操作后,只需调用委托或事件

    3. 将调用您的视图模型中挂钩的方法。

    4. 现在您可以在视图模型中执行所需的必要操作

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-08
      • 2020-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多