首页 > 解决方案 > 从 viewmodel 调用泛型方法

问题描述

我对泛型和 MVVM 还是很陌生。在学校为一个项目做这个,我的问题可能是我试图给人留下深刻的印象。我想我可能已经把自己编码进了一个洞,但我希望你们都可以帮助我摆脱它。

我已经创建了一个 dbcontext、一个数据服务,现在我正试图让它们在我的视图模型中很好地发挥作用——我无处可去。

数据库上下文工厂:

    public class TimeKeeprDbContextFactory : IDesignTimeDbContextFactory<TimeKeeprDbContext>
{
    public TimeKeeprDbContext CreateDbContext(string[] args = null)
    {
        var options = new DbContextOptionsBuilder<TimeKeeprDbContext>();
        options.UseSqlServer("Server=(localdb)\\MSSQLLocalDB;Database=TimeKeeprDB;Trusted_Connection=True;");

        return new TimeKeeprDbContext(options.Options);
    }
}

数据库上下文:

    public class TimeKeeprDbContext : DbContext
{
    public TimeKeeprDbContext(DbContextOptions options) : base(options) { }

    public DbSet<User> Users { get; set; }
    public DbSet<Event> Events { get; set; }
}

数据服务:

    public class DataService<T> : IDataService<T> where T: DomainObject
{
    private readonly TimeKeeprDbContextFactory _contextFactory;
    public DataService(TimeKeeprDbContextFactory contextFactory)
    {
        _contextFactory = contextFactory;
    }
    public async Task<T> Create(T entity)
    {
        using TimeKeeprDbContext context = _contextFactory.CreateDbContext();
        EntityEntry<T> createdResult = await context.Set<T>().AddAsync(entity);
        await context.SaveChangesAsync();
        return createdResult.Entity;
    } [...]

基础视图模型:

    public class BaseViewModel : INotifyPropertyChanged
{
    #region WindowProperties
    [.....]
    #endregion
    #region PropertyChanged

    protected void OnPropertyChanged<T>(Expression<Func<T>> action)
    {
        var propertyName = GetPropertyName(action);
        OnPropertyChanged(propertyName);
    }
    private static string GetPropertyName<T>(Expression<Func<T>> action)
    {
        var expression = (MemberExpression)action.Body;
        var propertyName = expression.Member.Name;
        return propertyName;
    }
    private void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            var e = new PropertyChangedEventArgs(propertyName);
            handler(this, e);
        }
    }
    public event PropertyChangedEventHandler PropertyChanged;
    #endregion
}

视图模型:

    public class MainViewModel : BaseViewModel
{
    private string _firstname;
    private string _lastname;
    public string FirstName
    {
        get => _firstname;
        set 
        {
            _firstname = value;
            OnPropertyChanged(() => FirstName);
        }
    }
    public string LastName
    {
        get => _lastname;
        set
        {
            _lastname = value;
            OnPropertyChanged(() => LastName);
        }
    }

    public ICommand CreateCommand { get { return new BaseCommand(Click); } }

    private void Click()
    {
        User user = new User()
        {
            FirstName = _firstname,
            LastName = _lastname
        };

        //call Create<T> from DataService

        ShowMessageBox($"{user.FirstName} {user.LastName}"); //just to make sure the object is ok
    }
}

我已经尝试了大约一百万件事,但我似乎无法理解我需要做什么才能从视图模型中的 DataService 调用“Create(user)”。有人可以指出我正确的方向吗?

PS我已经用谷歌搜索直到我的手指流血,但不幸的是,它并没有太大帮助。

标签: c#wpfgenericsmvvm

解决方案


很难说,因为我不知道您正在使用的所有框架或 nuget 包。但据我所知,您只需要在 MainViewModel 中的某处实例化您的 DataService,然后Create在您放置评论的地方调用它的方法//call Create<T> from DataService

//Instantiate your DataService somewhere
var service = new DataService<User>(new TimeKeeprDbContextFactory());
//call Create<T> from DataService
service.Create(user);

如果您在下面看到一条波浪线,service.Create(user)表明此调用未被等待,您可以通过像这样使您的函数 async/await 来解决这个问题。

private async void Click()
{
    User user = new User()
    {
        FirstName = _firstname,
        LastName = _lastname
    };

    //Instantiate your DataService somewhere
    var service = new DataService<User>(new TimeKeeprDbContextFactory());
    //call Create<T> from DataService
    await service.Create(user);

    ShowMessageBox($"{user.FirstName} {user.LastName}"); //just to make sure the object is ok}```
}

推荐阅读