C# WPF,Caliburn将数据库记录微绑定到VM

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

再次与WPF和Caliburn Micro进行斗争。如果记录存在,我想将DB记录绑定到视图。但是,检索记录后,视图不会使用检索到的字段进行更新。下面是am使用的类似代码:

视图:


视图模型:

[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,但你可能会发现它相当复杂。