从Service do ViewModel传递数据

时间:2019-12-18 12:57:27

标签: wpf mvvm

型号:

class UserModel
{
    public string FirstName { get; set; }
}

服务:

class UserService
{
    private async Task<string> DirectoryEntry()
    {
        SearchResult rs = await Task.Run(() =>
        {
            DirectoryEntry de = new DirectoryEntry("xxx");
            DirectorySearcher ds = new DirectorySearcher(de)
            {
                Filter = "(&((&(objectCategory=Person)(objectClass=User)))(sAMAccountName=" + "xxx" + "))",
                SearchScope = SearchScope.Subtree
            };
            return ds.FindOne();
        });
        var value = (rs.GetDirectoryEntry().Properties["businessCategory"].Value ?? "BRAK").ToString();
        return value;
   }
}

ViewModel:

class UserViewModel : INotifyPropertyChanged
{
    UserModel user = new UserModel();

    public string FirstName
    {
        ??
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChange(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

那么,如何将value传递给ViewModel? 我检查了一些示例,但在Service和VM之间无法实现。 我完全不知道如何在它们之间建立联系。 还是对mvvm的使用不正确?

1 个答案:

答案 0 :(得分:1)

假设您的服务方法实际上返回了一个值,则视图模型可以使用该值执行任何所需的操作,例如将其分配给UserModel的属性或假定类型匹配的自身属性。 / p>

通常,视图模型具有对服务的引用:

class UserViewModel : INotifyPropertyChanged
{
    readonly UserService service = new UserService();
    //call a method on the service in any method of the view model
}

在上面的代码中,视图模型强烈引用了服务的实现。使用服务实现的接口注入视图模型更为常见:

class UserViewModel : INotifyPropertyChanged
{
    readonly IUserService _service;

    public UserViewModel(IUserService service) => _service = service;
}

然后可以在运行时切换实现。例如,您可能想使用服务模拟来测试视图模型,但是在运行实际应用程序时使用“真实”服务实现。