Я использую 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>
Любые советы будут с благодарностью. Кажется, я что-то упускаю.