Wpf 从服务do ViewModel传递数据

Wpf 从服务do ViewModel传递数据,wpf,mvvm,Wpf,Mvvm,型号: class UserModel { public string FirstName { get; set; } } class UserService { private async Task<string> DirectoryEntry() { SearchResult rs = await Task.Run(() => { DirectoryEntry de = new Directo

型号:

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;
   }
}
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));
    }
}
服务:

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;
   }
}
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));
    }
}
那么,如何将
传递给ViewModel呢?
我检查了一些示例,但无法在服务和虚拟机之间实现它。
我完全不知道他们之间如何相处。

或者可能是mvvm的使用不正确?

如果您的服务方法实际返回一个值,视图模型可以使用该值执行任何它想要的操作,例如,将其分配给
UserModel
的属性,或者假定类型匹配,将其分配给自身的属性

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

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;
}

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

您的服务似乎没有返回任何内容?你在这里指的是什么价值?如果您的服务方法实际返回一个值,则视图模型可以使用该值执行任何它想要的操作,例如,将其分配给
UserModel
的属性或假定类型匹配的自身属性。它的返回:返回值;因此,在视图模型中调用该方法并使用该值。看看我的答案。