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
的属性或假定类型匹配的自身属性。它的返回:返回值;因此,在视图模型中调用该方法并使用该值。看看我的答案。