WPF, запись базы данных MicroBind Caliburn для VM

129
9

Еще раз борется с WPF и Caliburn Micro. Я хочу привязать запись БД к представлению, если запись существует. Однако после извлечения записи представление не обновляется с помощью извлеченных полей. Ниже приведен аналогичный код am, используя:

Посмотреть:

<TextBox x:Name="personId" Margin="114,12,288,281" >
<i:Interaction.Triggers>
<i:EventTrigger EventName="LostFocus">
<cal:ActionMessage MethodName="Retrieve" />
</i:EventTrigger>
</i:Interaction.Triggers>
</TextBox>
<TextBox x:Name="firstName" />
<TextBox x:Name="lastName" />

ViewModel:

[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);
}
}

}

Метод Retrieve запускается, и я получаю результаты в MessageBox. Однако представление не обновляется. Я что-то пропустил?

спросил(а) 2021-01-19T17:38:56+03:00 2 месяца, 4 недели назад
1
Решение
76

У вас есть нечеткое разделение моделей и взглядов на модель. Я бы выполнил ваш сценарий следующим образом:


[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);
}
}
}

ответил(а) 2021-01-19T17:38:56+03:00 2 месяца, 4 недели назад
44

Ваши данные извлекаются из базы данных в 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);
}
}

ответил(а) 2021-01-19T17:38:56+03:00 2 месяца, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема