Одна из самых больших вещей, которые я вижу, это то, что вы настраиваете свойства, а не связываете их.
Например,
datagrid_employees.ItemsSource = EmployeeViewModel.EmployeesView;
Вы говорите своей DataGrid, что ее ItemsSource должен быть этим конкретным объектом.Вам нужно привязать его к этому значению, чтобы вместо него указать , указать это свойство.Это заставит ваш пользовательский интерфейс правильно отражать то, что находится в вашей ViewModel
Другой огромный красный флаг, который я вижу, это ваша ViewModel, ссылающаяся на что-то вызываемое и EmployeeView
, что заставляет меня поверить, что ваши View и ViewModel слишком тесно связаны друг с другом.Ваш ViewModel
должен содержать всю вашу бизнес-логику и код, в то время как представление обычно является XAML и просто отражает ViewModel в удобной для пользователя форме.
View и ViewModel никогда не должны напрямую ссылаться друг на друга (в некоторых редких случаях у меня была ссылка View на мою ViewModel, но никогда не было наоборот)
Например, EmployeesViewModel
может содержать
ObservableCollection<Employee> Employees
Employee SelectedEmployee
ICommand AddEmployeeCommand
ICommand DeleteEmployeeCommand
в то время как ваш View (XAML) может выглядеть так:
<StackPanel>
<StackPanel Orientation="Horizontal">
<Button Content="Add" Command="{Binding AddEmployeeCommand}" />
<Button Content="Delete" Command="{Binding DeleteEmployeeCommand}" />
</StackPanel>
<DataGrid ItemsSource="{Binding Employees}"
SelectedItem="{Binding SelectedEmployee}">
... etc
</DataGrid>
<UniformGrid DataContext="{Binding SelectedEmployee}" Columns="2" Rows="4">
<TextBlock Text="ID" />
<TextBox Text="{Binding Id}" />
... etc
</UniformGrid >
</StackPanel>
И единственное, что вы должны установить - это DataContext всего окна.Обычно я перезаписываю App.OnStartup()
для запуска моего приложения:
public partial class App : Application
{
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
var view = new MainWindow();
var vm = new EmployeesViewModel;
view.DataContext = vm;
view.Show();
}
}
Хотя я полагаю, что в вашем случае это также будет работать:
public MainWindow()
{
InitializeComponent();
this.DataContext = new EmployeesViewModel();
}