Как я могу обновить запись ObservableCollection и обновить представление? - PullRequest
0 голосов
/ 26 октября 2019

Я использую EntityFramework 6 и MVVMLight, но столкнулся с проблемой, я не уверен, как решить ее наилучшим образом.

У меня есть EquipmentOverview, где списокотображается оборудование, которым мы можем управлять с помощью кнопок «Добавить», «Редактировать» и «Удалить». Теперь можно добавить новые или удалить их, так как я могу использовать .Add() и .Remove() для ObservableCollection<EquipmentViewModel>, и он автоматически обновляет список пользовательского интерфейса из-за RaisePropertyChanged(); в объекте SelectedEquipment.

Моя проблема заключается в обновлении оборудования. У меня есть метод Save, который прекрасно обновляет запись базы данных, но по какой-то причине я просто не могу получить список пользовательского интерфейса для обновления модифицированного оборудования. Какой лучший подход?

EquipmentManagementViewModel.cs

В месте TODO: я хотел бы обновить как список ObservableCollection, так и пользовательский интерфейс. Я думал, что интерфейс должен обновляться уже, так как у меня есть RaisePropertyChanged(); на SelectedEquipment, но когда я изменяю его, ничего в обновлениях пользовательского интерфейса ...

namespace Manager.ViewModel
{
    public class EquipmentManagementViewModel : ViewModelBase
    {
        // Models
        private EquipmentOverviewViewModel _equipmentOverviewViewModel;
        public EquipmentViewModel Equipment { get; set; }
        public ObservableCollection<CategoryViewModel> Categories { get; set; }

        // Commands
        public ICommand CancelCommand { get; set; }
        public ICommand SaveCommand { get; set; }

        public EquipmentManagementViewModel(EquipmentOverviewViewModel e)
        {
            _equipmentOverviewViewModel = e;
            Equipment = _equipmentOverviewViewModel.SelectedEquipment ?? new EquipmentViewModel();

            RequestCategories();

            InitializeCommands();
        }

        private void RequestCategories()
        {
            CategoryRepository c = new CategoryRepository();
            var categoryList = c.GetCategories();
            Categories = new ObservableCollection<CategoryViewModel>(categoryList);
        }

        private void InitializeCommands()
        {
            SaveCommand = new RelayCommand(Save);
            CancelCommand = new RelayCommand(Cancel);
        }

        private void Save()
        {
            using (var context = new ManagerEntities())
            {
                if (context.Equipments.Find(Equipment.ToModel().Id) != null)
                {
                    Equipment e = context.Equipments.Find(Equipment.ToModel().Id);
                    EquipmentViewModel equipmentViewModel = new EquipmentViewModel(e);
                    equipmentViewModel.SetEquipment(Equipment.ToModel());

                    // TODO: Update Equipment in _equipmentOverviewViewModel.Equipments
                    _equipmentOverviewViewModel.SelectedEquipment = Equipment;
                }
                else
                {
                    context.Equipments.Add(Equipment.ToModel());
                    _equipmentOverviewViewModel.Equipments.Add(Equipment);
                }
                context.SaveChanges();
            }
            _equipmentOverviewViewModel.equipmentManagementWindow.Close();
        }

        private void Cancel()
        {
            _equipmentOverviewViewModel.equipmentManagementWindow.Close();
        }
    }
}

EquipmentOverviewViewModel.cs

namespace Manager.ViewModel
{
    public class EquipmentOverviewViewModel : ViewModelBase
    {
        // Windows
        public EquipmentManagementWindow equipmentManagementWindow;

        // Models
        public ObservableCollection<EquipmentViewModel> Equipments { get; set; }
        private EquipmentViewModel _selectedEquipment;
        public EquipmentViewModel SelectedEquipment
        {
            get { return _selectedEquipment; }
            set { _selectedEquipment = value; RaisePropertyChanged(); }
        }

        // Commands
        public ICommand AddEquipmentCommand { get; set; }
        public ICommand EditEquipmentCommand { get; set; }
        public ICommand DeleteEquipmentCommand { get; set; }

        public EquipmentOverviewViewModel()
        {
            InitializeCommands();

            EquipmentRepository equipmentRepository = new EquipmentRepository();
            var equipmentList = equipmentRepository.GetEquipments();
            Equipments = new ObservableCollection<EquipmentViewModel>(equipmentList);
        }

        private void InitializeCommands()
        {
            AddEquipmentCommand = new RelayCommand(AddEquipment);
            EditEquipmentCommand = new RelayCommand(EditEquipment, HasSelected);
            DeleteEquipmentCommand = new RelayCommand(DeleteEquipment, HasSelected);
        }

        private void AddEquipment()
        {
            SelectedEquipment = null;
            EditEquipment();
        }

        private void EditEquipment()
        {
            equipmentManagementWindow = new EquipmentManagementWindow();
            equipmentManagementWindow.Show();
        }

        private void DeleteEquipment()
        {
            using (var context = new ManagerEntities())
            {
                Equipment equipment = SelectedEquipment.ToModel();
                context.Equipments.Attach(equipment);
                context.Equipments.Remove(equipment);
                context.SaveChanges();
            }
            Equipments.Remove(SelectedEquipment);
        }

        private bool HasSelected()
        {
            return SelectedEquipment != null;
        }
    }
}

И, при необходимости, EquipmentOverviewWindow.xaml

<Window x:Class="Manager.View.EquipmentOverviewWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:Manager.View"
        mc:Ignorable="d"
        WindowStartupLocation="CenterScreen"
        ResizeMode="NoResize"
        DataContext="{Binding EquipmentOverview, Source={StaticResource Locator}}"
        Title="Manage Equipment" Height="350" Width="550">
    <StackPanel>
        <Grid Margin="10,10,10,0" Height="250">
            <DataGrid AutoGenerateColumns="False" IsReadOnly="True"
                      SelectedItem="{Binding SelectedEquipment}" ItemsSource="{Binding Equipments}">
                <DataGrid.Columns>
                    <DataGridTextColumn Header="#" Binding="{Binding Id}" />
                    <DataGridTextColumn Header="Name" Binding="{Binding Name}" Width="160" />
                    <DataGridTextColumn Header="Intelligence" Binding="{Binding Intelligence}" Width="75" />
                    <DataGridTextColumn Header="Strength" Binding="{Binding Strength}" Width="60" />
                    <DataGridTextColumn Header="Agility" Binding="{Binding Agility}" Width="50" />
                    <DataGridTextColumn Header="Value" Binding="{Binding Value}" Width="50" />
                    <DataGridTextColumn Header="Category" Binding="{Binding CategoryName}" Width="*" />
                </DataGrid.Columns>
            </DataGrid>
        </Grid>
        <Grid Margin="0,0,0,10" Height="45" VerticalAlignment="Center" HorizontalAlignment="Center">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*" />
                <ColumnDefinition Width="*" />
                <ColumnDefinition Width="*" />
            </Grid.ColumnDefinitions>

            <Button Width="100" Height="30" FontSize="16"
                        Foreground="White" Background="#FF6F9BDA" Content="Add New"
                        Grid.Column="0" Command="{Binding AddEquipmentCommand}">
            </Button>
            <Button Width="100" Height="30" FontSize="16"
                        Foreground="White" Background="#FF6F9BDA" Content="Edit"
                        Grid.Column="1" Command="{Binding EditEquipmentCommand}">
            </Button>
            <Button Width="100" Height="30" FontSize="16"
                        Foreground="White" Background="#FF6F9BDA" Content="Delete"
                        Grid.Column="2" Command="{Binding DeleteEquipmentCommand}">
            </Button>
        </Grid>
    </StackPanel>
</Window>

Любые советы будут с благодарностью. Кажется, я что-то упускаю.

...