从数据源拖放到WPF窗口不起作用

时间:2013-09-18 18:10:48

标签: wpf data-binding

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

在使用btw首先是数据库的数据库的实体框架时,我遇到了很大的问题。

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

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

任何人都可以帮助我吗?我到处寻找。任何帮助表示赞赏

2 个答案:

答案 0 :(得分:5)

确定。我实际上是通过那篇文章,只是为了表现出诚意并让你知道我真的想帮助你。

我得出以下结论:

  • 该文章展示了一个从Entity Framework上下文获取数据并在WPF DataGrid中显示数据的基本方案。
  • 它没有任何形式的验证或业务规则。
  • 它没有任何UI行为,例如有条件地启用/禁用或显示/隐藏任何UI元素。
  • 除了从数据库获取数据/向数据库保存数据之外,除了获取/保存数据之外什么都不需要,所以这种情况下Designer是有用的。
  • 不幸的是(幸运的是,对于我们所有以此为生的开发人员而言),大多数应用程序都需要一定程度的验证和业务规则以及某种级别的UI逻辑。
  • 在开发复杂的逻辑时,设计师真的没用。

可以使用设计师来处理你不需要复杂逻辑的情况,但是我必须警告你以下缺点:

  • Visual Studio WPF设计器生成固定大小的固定位置UI。在具有不同屏幕分辨率和DPI设置的计算机中执行时,这些类型的UI无法正常工作。就像winforms一样。
  • 它还会生成包含许多不必要的东西的XAML(例如x:Name="categoryIdColumn"和类似Margin="13,13,43,191"之类的东西,从维护性/可伸缩性的角度看它们真的很糟糕)
  • 从我所看到的,设计师生成的XAML也包含CollectionViewSource,这既是好事也是坏事。这是一件好事,因为它在DataGrid中启用了Design-Time Data,但它也很糟糕,因为它会使你的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,而不是坚持做难的事情


要记住的另一个非常重要的方面是,一般来说,you don't put anything in code-behind in WPF因为它不是必需的,因此该教程实际上是针对WPF Way of doing things,但这没关系,因为它实际上是一个实体框架教程,而不是WPF教程。


  

易于开发

你真的需要重新考虑你所说的“易于开发”。当涉及到UI开发时,我将“易于开发”称为实​​际being able to do what I want with the UI,而不必诉诸涉及P / Invoke(无论那意味着什么)和“所有者绘制”类型的东西的糟糕程序代码实践。

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

  • winforms让你可以用设计师做任何事情(这只是因为设计师生成的代码实际上是如此糟糕,以至于如果他们没有设计师就没有人会使用过winforms)但是当它到来时添加复杂的数据绑定或UI逻辑,你永远不会遇到winforms的无能。

  • WPF鼓励手工编写XAML,不仅因为XAML是声明性的(与程序性winforms方法相反),而且因为可定制性和可重用性的水平如此之高,以至于以设计师为中心的方法没有意义


  

拖放是最简单的方法

不,不是。这实际上是艰难的方式。简单的方法是学习XAML并能够Things you can't even imagine to do with winforms


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

答案 1 :(得分:4)

自动从模型创建数据网格

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

首先执行此操作:在项目中创建名为Models的文件夹,然后首先使用Entity Framework DB或手动编写要显示的模型。

在同一个文件夹中创建一个虚拟类,它是IEnumerable的一个属性,就像这样..

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

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

Data Source Wizard

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

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

它应默认为DataGrid,但您可以右键单击数据源并将其更改为detail,datagrid或选择它所代表的类的各个属性。

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

完成此操作后,您将在该窗口的窗口加载事件,usercontrol等中将代码注入到视图后面的代码中。

        // 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属性。它看起来像这样:

Collection View Source KEY

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

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