gpt4 book ai didi

c# - 从ViewModel调用通用方法

转载 作者:行者123 更新时间:2023-12-03 10:31:08 32 4
gpt4 key购买 nike

我对泛型和MVVM还是很陌生。在学校为一个项目进行这项工作,我的问题可能是我想给人留下深刻的印象。我想我可能已经将自己编码成一个漏洞,但是我希望大家都能帮助我摆脱困境。
我创建了一个dbcontext,一个数据服务,现在我正试图让它们在我的 View 模型中很好地播放-我什么也没做。
DbContextFactory:

    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);
}
}
DbContext:
    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;
} [...]
BaseViewModel:
    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
}
ViewModel:
    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
}
}
我已经尝试了大约一百万种事情,但是似乎无法将需要做的事情包起来才能在 View 模型中从DataService调用“Create(user)”。有人可以指出我正确的方向吗?
附言:我一直在谷歌搜索直到我的手指流血,但不幸的是,它并没有起到太大作用。

最佳答案

很难说,因为我不知道您使用的所有框架或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)下看到一个弯曲的行,指示未等待此调用,则可以通过使函数像这样异步/等待来解决此问题。
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}```
}

关于c# - 从ViewModel调用通用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65135474/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com