WPF页面绑定失败

时间:2019-06-26 15:34:02

标签: wpf caliburn.micro

我希望有人能善良地引导我朝正确的方向前进。 我正在努力使自己了解WPF。 我已经在主窗口上创建了一个带有两个按钮和一个框架的4.8框架应用程序。我正在使用Caliburn.Micro进行绑定–这是我的测试应用程序,用于尝试并理解它。 当您按第一个按钮时,窗口上下文将设置为页面,并在页面上带有“雇员”数据网格。数据是从后端Oracle数据库提供的(我正在尝试遵循MVVM模式。)这非常有效。 当您按下另一个按钮时,主窗口将在框架内显示第二页–这次是部门。这很有用。我在页面中有一个未绑定的文本框,该文本框应显示为应有的状态。 我花了两天时间才开始工作的部分是部门的数据网格。它返回空白。

我肯定知道Departments变量正在填充。我已经确认了这两种方式。我已经遍历了代码,可以看到正在填充的值。我还将代码放在了Employee页面的下面,并在数据网格中显示了值。 我也尝试在“部门”页面中显示雇员数据网格,但在运行时也为空白。 尽我所能识别,除了明显的名称更改之外,两页后面的代码是相同的。

这是从我的部门视图模型中获得的:

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 :(得分:0)

要使其正常工作: 主窗口:

<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还是陌生的。我希望这就是Ed Plunkett的想法,也许是这样。再次谢谢你,爱德。