Обновление списка после обновления базы данных (WPF + MVVM) - PullRequest
0 голосов
/ 14 октября 2019

У меня есть небольшая форма WPF с Listview (привязанным к наблюдаемой коллекции)

    <ListView Name="Employees_Listview" ItemsSource="{Binding Employees, UpdateSourceTrigger=PropertyChanged}" SelectedItem="{Binding YourSelectedItem, Mode=TwoWay}" Height="86" IsSynchronizedWithCurrentItem="True">
        <ListView.View>
            <GridView>
                <GridViewColumn Header="FirstName" DisplayMemberBinding="{Binding FirstName}"/>
                <GridViewColumn Header="LastName" DisplayMemberBinding="{Binding LastName}"/>
            </GridView>
        </ListView.View>
    </ListView>

2 текстовых поля

<TextBox Name="FirstName" Width="136" Text="{Binding SelectedItem.FirstName, ElementName=Employees_Listview, Mode=TwoWay}" />
<TextBox Name="LastName" Width="136" Text="{Binding SelectedItem.LastName, ElementName=Employees_Listview, Mode=TwoWay}" />

и кнопкой

<Button Command="{Binding UpdateEmployeeCommand}" Margin="0,0,10,0">Update</Button>

Оба текстовых поля привязаны к выбранному элементу в просмотре списка, поэтому при обновлении значения текстового поля оно автоматически отражает изменения в просмотре списка. Теперь я хотел бы сначала обновить базу данных, и если нет ошибки, я бы хотел обновить представление списка. Мой код обновления выглядит следующим образом

    var container = ContainerConfig.Configure();
    using (var scope = container.BeginLifetimeScope())
    {
        var SelectedEmployee = scope.Resolve<IEmployeeRepository>();
        if (!SelectedEmployee.Update(YourSelectedItem))
        {
            MessageBox.Show("Datensatz konnte nicht aktualisiert werden!" + "\n" + "Bitte den Administrator verständigen!");
            return;
        };
    }

Я попытался установить режим текстового поля в OneWay, но из-за того, что он привязан к SelectedItem, я не могу получить новое значение текстового поля, только «старое» значение списка просмотра,Как я могу проверить и обновить свою базу данных перед обновлением списка?

ОБНОВЛЕНИЕ Возможно, мне нужно выбрать другой подход, подобный этому: TextBox привязал новое свойство, объявленное

Просмотр

<TextBox Text="{Binding NewFirstName}" Width="123"></TextBox>

и моя ViewModel

//TEST
private string newfirstname;


public string NewFirstName
{
    get { return newfirstname; }
    set
    {
        newfirstname= value;
        RaisePropertyChanged("NewFirstName");
    }
}
//TEST
public EmployeeEntity YourSelectedItem
{
    get
    {
        return _yourSelectedItem;
    }
    set
    {
        NewFirstName = value.FirstName;
        _yourSelectedItem = value;
        RaisePropertyChanged("YourSelectedItem");
    }
}

Думаю, это не лучший путь: /

1 Ответ

1 голос
/ 14 октября 2019

Я бы сделал это следующим образом:

  1. Обновите базу данных.
  2. Либо верните обновленный объект данных из метода обновления, либо запросите базу данных после обновления, чтобы получитьобновленный объект данных.
  3. Обновите объект в вашем приложении новыми значениями.

Я бы настоятельно рекомендовал иметь уникальный идентификатор / идентификатор как в вашей базе данных, так и в ваших классах в пределахприложение, чтобы облегчить это, если вы этого еще не сделали.

Кроме того, вам нужно будет реализовать INotifyPropertyChanged в ваших классах модели, так как обновление элемента в ObservableCollection не окажет никакого влиянияв вашем представлении, поскольку ObservableCollection вызывает уведомления только при изменении самой коллекции, например, при добавлении / удалении, а не при изменении свойств внутри ее членов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...