我正在使用WPF MVVM模式创建一个客户服务程序我创建了一个注册窗口和一个客户信息窗口我想把客户信息窗口的数据网格的值带入创建窗口的文本框
这是信息ViewModel
public class MainViewModel : ObservableObject
{
private MemberInfo selectedCustomer = new MemberInfo();
public MemberInfo SelectedCustomer
{
get => selectedCustomer;
set
{
SetProperty(ref selectedCustomer, value);
RegisterViewModel RV = new RegisterViewModel();
if (value != null)
{
RV.Name = selectedCustomer.Name;
}
}
}
}
这是create ViewModel
public class RegisterViewModel : ObservableObject
{
private string name = "";
public string Name
{
get => this.name;
set => SetProperty(ref this.name, value);
}
}
如果我像这样使用它,值只经过set,并且没有值来执行get
如果我像这样使用它,则值只经过set,并且没有值来执行get
不完全确定我是否理解正确,但是您可以将MemberInfo
对象传递给RegisterViewModel
的构造函数,并通过只读属性将其公开给视图。
因此,RegisterViewModel
变成:
public class RegisterViewModel : ObservableObject
{
public RegisterViewModel(MemberInfo member)
{
Member = member;
}
public MemberInfo Member { get; }
}
因此在MainViewModel
中:
public MemberInfo SelectedCustomer
{
get => selectedCustomer;
set
{
SetProperty(ref selectedCustomer, value);
RegisterViewModel RV = new RegisterViewModel(selectedCustomer);
}
}
视图绑定到:
Text = "{Binding Path=Member.Name, Mode=TwoWay}"
编辑
由于RegisterViewModel
期望MemberInfo
对象,您不能注册它并简单地调用GetService<T>
方法。
在这种情况下,我通常使用ActivatorUtilities。创建实例,它是Microsoft.Extensions.DependencyInjection.Abstractions
包的一部分。
通过扩展方法:
public static T Create<T>(this IServiceProvider provider, params object[] args) where T : class
{
return ActivatorUtilities.CreateInstance<T>(provider, args);
}
可以调用:
this.DataContext = App.Current.Services.Create<RegisterViewModel>(member);
这样,如果RegisterViewModel
期望通过构造函数注册额外的服务,这些服务将由容器解析。