Сбой привязки страницы WPF - PullRequest
0 голосов
/ 26 июня 2019

Я надеялся, что кто-то будет достаточно добр, чтобы направить меня в правильном направлении.Я пытаюсь разобраться с WPF.Я создал приложение для фреймворка 4.8 с двумя кнопками и рамкой в ​​главном окне.Я использую Caliburn.Micro для привязки - это мое тестовое приложение, чтобы попытаться понять его.Когда вы нажимаете первую кнопку, контекст окна устанавливается на страницу с сеткой данных сотрудников.Данные поступают из серверной базы данных Oracle (я пытаюсь следовать шаблону MVVM). Это работает отлично.Когда вы нажимаете другую кнопку, в главном окне отображается вторая страница в рамке - на этот раз, Отделы.Это много работает.У меня есть несвязанное текстовое поле на странице, и это показывает, как следует.Часть, которую я потратил два дня, пытаясь добраться до работы, - это сетка данных для департаментов.Он возвращает пустое значение.

Я точно знаю, что переменная Departments заполняется.Я подтвердил это двумя способами.Я прошел через код и вижу, что значения заполняются.Я также разместил приведенный ниже код на странице «Сотрудник» и на нем отображалась сетка данных со значениями.Я также пытался отобразить сетку данных сотрудников на странице Департаментов, но она также пуста во время выполнения.Насколько я могу различить, код на этих двух страницах идентичен, за исключением очевидного изменения имени.

Это из моей модели отдела Просмотр:

using Caliburn.Micro;
using DataLibrary;

namespace WpfEmployees.ViewModels
{
    public class DepartmentsViewModel : Screen
{
        public BindableCollection<DepartmentsModel> Departments { get; set; }
        public DepartmentsViewModel()
        {
            DepartmentsProcessor dp = new DepartmentsProcessor();
            Departments = new BindableCollection<DepartmentsModel>(dp.LoadDepartments());
        }
    }
}

С точки зрения:

<DataGrid x:Name="Departments" ></DataGrid>

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

1 Ответ

0 голосов
/ 27 июня 2019

Чтобы заставить это работать: Главное окно:

<Window x:Class="WpfEmployees.MainWindow"
        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:WpfEmployees"
        xmlns:viewmodels="clr-namespace:WpfEmployees.ViewModels"

    xmlns:views="clr-namespace:WpfEmployees.Views"
        mc:Ignorable="d"        
        Title="MainWindow" Height="850" Width="650" Loaded="ShowDepartmentsPage">
    <Window.Resources>

    <DataTemplate x:Name="employeesViewTemplate" DataType="{x:Type viewmodels:EmployeesViewModel}">
        <views:EmployeesView DataContext="{Binding}"/>

    </DataTemplate

    <DataTemplate x:Name="departmentsViewTemplate" DataType="{x:Type viewmodels:DepartmentsViewModel}">
        <views:DepartmentsView DataContext="{Binding}"/>

    </DataTemplate>

</Window.Resources>
    <Grid>
...
            <Button x:Name="ShowEmployeesBtn" Content="Employees"
                    Margin="10 0 0 0" Click="ShowEmployeesPage"/>
            <Button x:Name="ShowDepartmentsBtn" Content="Departments"
                    Margin="10 0 0 0" Click="ShowDepartmentsPage" />
...
        <ContentControl Content="{Binding}"/>
    </Grid>
</Window>

Код кнопки главного окна

public partial class MainWindow
    {
...

private void ShowEmployeesPage(object sender, RoutedEventArgs e)
{
 DataContext = new EmployeesViewModel();
}

Просмотр модели

public class EmployeesViewModel 
...
public ObservableCollection<EmployeesModel> ObEmployees { get; set; }
...
public EmployeesViewModel()
        {
            EmployeesProcessor ep = new EmployeesProcessor();
            ObEmployees = new ObservableCollection<EmployeesModel>
(ep.LoadEmployees());
        }

Я не знаю, является ли это лучшим маршрутом. Это работает, но я слишком новичок в WPF, чтобы знать. Я надеюсь, что это то, что имел в виду Эд Планкетт, так что может быть. Еще раз спасибо, Эд.

...