4

我的任务是为我的公司设计一个联系人管理程序。我们有 VS 2012,因为我之前从未使用过 WPF,所以我想我会用它来开发这个应用程序。

在使用数据库的实体框架时,我在开始绑定时遇到了很大的问题,顺便说一句,数据库首先是数据库。

我已按照这封信链接中的说明进行操作。 http://msdn.microsoft.com/en-us/data/jj574514.aspx

对象显示在数据源窗口中就好了。但是当我拖放到我的窗口时,什么也没有发生。不知道我做错了什么,也找不到其他人遇到这个问题。

有谁可以帮我离开这里吗?我到处都看过。任何帮助表示赞赏

4

2 回答 2

6

好的。我实际上浏览了那篇文章,只是为了表现出诚意,让你知道我真的想帮助你。

我得出以下结论:

  • 那篇文章展示了从实体框架上下文获取数据并将其显示在 WPF DataGrid 中的非常基本的场景。
  • 它没有任何类型的验证或业务规则。
  • 它没有任何 UI 行为,例如有条件地启用/禁用或显示/隐藏任何 UI 元素。
  • 这种场景是设计器有用的地方,当您实际上不需要任何东西,除了从/向数据库获取/保存数据。
  • 不幸的是(或者幸运的是,对于我们所有以此为生的开发人员来说),大多数应用程序都需要一定程度的验证和业务规则以及一定程度的 UI 逻辑。
  • 在开发复杂的逻辑时,设计师真的没用。

可以将设计器用于不需要复杂逻辑的情况,但是我必须警告您以下缺点:

  • Visual Studio WPF 设计器生成固定大小、固定位置的 UI。这些类型的 UI 在具有不同屏幕分辨率和 DPI 设置的计算机中执行时效果不佳。就像winforms一样。
  • 它还生成具有许多不必要的东西的 XAML(例如从可维护性/可伸缩性的角度来看非常糟糕的x:Name="categoryIdColumn"东西)Margin="13,13,43,191"
  • 据我所见,设计器生成的 XAML 还包含一个CollectionViewSource,这既是好事也是坏事。这是一件好事,因为它可以Design-Time Data在 DataGrid 中启用,但它也很糟糕,因为它会用大量不需要的东西使 XAML 膨胀,并引入<Window.Resources>使事情复杂化的不必要的东西。

现在,这是该 DataGrid 所需的最小 XAML,没有设计时数据支持:

<Window x:Class="MiscSamples.DesignTimeDataGrid"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="DesignTimeDataGrid">
    <DataGrid ItemsSource="{Binding}" AutoGenerateColumns="False">
        <DataGridTextColumn Header="Category Id" Binding="{Binding CategoryId}"/>
        <DataGridTextColumn Header="Name" Binding="{Binding Name}"/>
    </DataGrid>
</Window>

你看?实际上,键入它(在 Intellisense 的帮助下更是如此)比浏览属性窗口并手动设置这些属性要快得多。

我的建议是你要熟悉 XAML 而不是硬着头皮做事


要记住的另一个非常重要的方面是,一般来说,您不会在 WPF 中的代码隐藏中放置任何内容,因为它不是必需的,因此该教程实际上违反了WPF 的做事方式,但这没关系,因为它实际上是实体框架教程,而不是 WPF 教程。


易于开发

你真的需要重新考虑你所谓的“易于开发”。当谈到 UI 开发时,我将“易于开发”称为实​​际上能够使用 UI 做我想做的事情,而不必求助于涉及 P/Invoke(无论这意味着什么)和“所有者绘制”类型的糟糕程序代码实践万事万物。

WPF 提供了真正的易于开发,而不是 winforms 所展示的虚假的易于开发

  • winforms 让您可以与设计器一起做所有事情(这只是因为设计器生成的代码实际上非常糟糕,如果没有设计器,没有人会使用 winforms)但是当涉及到添加复杂的 DataBinding 或 UI 时逻辑你永远被winforms的无能所困。

  • WPF 鼓励手动编写 XAML,不仅因为 XAML 是声明性的(与过程式 winforms 方法相反),而且因为可定制性和可重用性的级别非常高,以设计者为中心的方法没有意义。


拖放是最简单的方法

不,这不对。这实际上是一个艰难的道路。简单的方法是学习 XAML 并能够做一些你甚至无法想象用 winforms 做的事情


如果以设计师为中心的方法对您仍然有意义,您可能想尝试Expression Blend

于 2013-09-20T23:40:39.450 回答
4

从您的模型自动创建数据网格

使用数据源将模板拖放到 WPF 控件上是一种快速启动和运行的方法!

首先这样做:在您的项目中创建一个名为 Models 的文件夹,然后首先使用 Entity Framework DB 或手动编写要显示的模型。

或者参见下面关于对象绑定的讨论......

在同一个文件夹中创建一个虚拟类,它是 IEnumerable 的属性,如下所示。

public IEnumerable<MyClassModel> MyCollection { get; set; }

从那里转到 Main Visual Studio 菜单,查看/其他 Windows/数据源并单击该链接。

数据源向导

单击 Object 并找到上面刚刚创建的 MyCollection 属性。

现在在 WPF 中打开一个用户控件或窗口,但保持数据源工具箱处于打开状态。

它应该默认为 DataGrid,但您可以右键单击数据源并将其更改为详细信息、数据网格或选择它所代表的类的各个属性。

只需将该数据源拖到 XAML 的网格区域。右键单击您看到的新内容,然后单击重置以将内容设置为整个窗口的大小。

完成此操作后,您将在该窗口、用户控件等的窗口加载事件中将代码注入到视图后面的代码中,如下所示。

        // Do not load your data at design time.
         if (!System.ComponentModel.DesignerProperties.GetIsInDesignMode(this))
         {
            //Load your data here and assign the result to the CollectionViewSource.
            System.Windows.Data.CollectionViewSource myCollectionViewSource = (System.Windows.Data.CollectionViewSource)this.Resources["Resource Key for CollectionViewSource"];
            myCollectionViewSource.Source = your data
        // }

返回到 XAML 并查找在将属性拖动到 XAML 时也插入的 CollectionViewSource KEY 属性。它看起来像这样:

集合查看源KEY

在后面的代码中使用 Key 名称,然后将 CVS“绑定”到您的数据源,它是 MyClassModel 类型的可枚举,它可以驻留在视图模型中,也可以在您选择的视图后面的代码中。

如果您只使用 CollectionViewSource 作为网格的数据上下文,则不需要为任何底层集合实现 INPC!每次更新源时,CVS 都会自动更新视图!一旦掌握了这一点,您就可以在 2 分钟内创建数据的工作视图原型!忘记需要太长时间的手动编码 XAML。

对象绑定

使用返回如下内容的静态方法创建一个静态类:

在此处输入图像描述

使用数据源向导时选择“对象”选项。

单击确定,您应该会看到如下内容:

在此处输入图像描述

您刚刚将所有属性映射到数据源定义中。

于 2015-03-03T19:22:13.373 回答