C# WPF,Caliburn将数据库记录微绑定到VM
再次与WPF和Caliburn Micro进行斗争。如果记录存在,我想将DB记录绑定到视图。但是,检索记录后,视图不会使用检索到的字段进行更新。下面是am使用的类似代码: 视图:C# WPF,Caliburn将数据库记录微绑定到VM,c#,wpf,C#,Wpf,再次与WPF和Caliburn Micro进行斗争。如果记录存在,我想将DB记录绑定到视图。但是,检索记录后,视图不会使用检索到的字段进行更新。下面是am使用的类似代码: 视图: 视图模型: [ImplementPropertyChanged] internal class PersonViewModel { public string personId { get; set; } public string firstName { get; set; } publi
视图模型:
[ImplementPropertyChanged]
internal class PersonViewModel
{
public string personId { get; set; }
public string firstName { get; set; }
public string lastName { get; set; }
public void Retrieve()
{
try
{
using (var con = new SqlConnection(conStr))
{
var q = con.Query<PersonViewModel>("select firstName,lastName from Person where id = @id", new {id = personId}).First();
MessageBox.Show("Succesfully retrieved " + q.firstName + " " + q.lastName);
}
}
catch (Exception x)
{
Console.WriteLine("error retrieving due to {0}", x.Message);
}
}
[ImplementPropertyChanged]
内部类PersonViewModel
{
公共字符串personId{get;set;}
公共字符串名{get;set;}
公共字符串lastName{get;set;}
公共无效检索()
{
尝试
{
使用(var con=new SqlConnection(contr))
{
var q=con.Query(“选择firstName,lastName from Person,其中id=@id”,new{id=personId}”).First();
MessageBox.Show(“成功检索”+q.firstName+“”+q.lastName);
}
}
捕获(异常x)
{
WriteLine(“由于{0}而检索错误”,x.Message);
}
}
}
Retrieve
方法正在启动,我正在消息框中获取结果。但是,该视图不会更新。我遗漏了什么吗?您的数据将从数据库检索到q
。您需要将数据复制到personId
,firstName
等属性中。更新属性时,属性更改通知将更新视图
大概是这样的:
public void Retrieve()
{
try
{
using (var con = new SqlConnection(conStr))
{
var q = con.Query<PersonViewModel>("select firstName,lastName from Person where id = @id", new {id = personId}).First();
// Copy database data into the local properties so they will update the view...
this.personId = q.personId;
this.firstName = q.firstName;
...
MessageBox.Show("Succesfully retrieved " + q.firstName + " " + q.lastName);
}
}
catch (Exception x)
{
Console.WriteLine("error retrieving due to {0}", x.Message);
}
}
[ImplementPropertyChanged]
public class PersonDetailsPageViewModel
{
public Person Person { get; set; }
public void Retrieve()
{
try
{
using (var con = new SqlConnection(conStr))
{
Person = con.Query<Person>("select firstName,lastName from Person where id = @id", new {id = personId}).First();
}
}
catch (SqlException ex)
{
Console.WriteLine("error retrieving due to {0}", ex.Message);
}
}
}
public void Retrieve()
{
尝试
{
使用(var con=new SqlConnection(contr))
{
var q=con.Query(“选择firstName,lastName from Person,其中id=@id”,new{id=personId}”).First();
//将数据库数据复制到本地属性中,以便它们更新视图。。。
this.personId=q.personId;
this.firstName=q.firstName;
...
MessageBox.Show(“成功检索”+q.firstName+“”+q.lastName);
}
}
捕获(异常x)
{
WriteLine(“由于{0}而检索错误”,x.Message);
}
}
您对模型和viewmodel问题的分离不清楚。
我会像这样实现您的场景:
public void Retrieve()
{
try
{
using (var con = new SqlConnection(conStr))
{
var q = con.Query<PersonViewModel>("select firstName,lastName from Person where id = @id", new {id = personId}).First();
// Copy database data into the local properties so they will update the view...
this.personId = q.personId;
this.firstName = q.firstName;
...
MessageBox.Show("Succesfully retrieved " + q.firstName + " " + q.lastName);
}
}
catch (Exception x)
{
Console.WriteLine("error retrieving due to {0}", x.Message);
}
}
[ImplementPropertyChanged]
public class PersonDetailsPageViewModel
{
public Person Person { get; set; }
public void Retrieve()
{
try
{
using (var con = new SqlConnection(conStr))
{
Person = con.Query<Person>("select firstName,lastName from Person where id = @id", new {id = personId}).First();
}
}
catch (SqlException ex)
{
Console.WriteLine("error retrieving due to {0}", ex.Message);
}
}
}
[ImplementPropertyChanged]
公共类PersonDetailsPageViewModel
{
公众人物{get;set;}
公共无效检索()
{
尝试
{
使用(var con=new SqlConnection(contr))
{
Person=con.Query(“从Person中选择firstName,lastName,其中id=@id”,new{id=personId}”).First();
}
}
catch(SqlException-ex)
{
WriteLine(“由于{0}而检索错误”,例如Message);
}
}
}
谢谢。考虑到这一点,但是我在ViewModel中使用Dapper时,是否可以自动绑定它。我还没有找到复制数据的好方法。手动检索和复制通常不太繁重。问题是我有一些ViewModel包含20多个字段。无论如何,我会接受你的回答,因为没有指定自动绑定。可能值得一看AutoMapper,但你可能会发现它相当复杂。