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

shstlldc  于 2023-06-07  发布在  其他
关注(0)|答案(3)|浏览(409)

我的任务是为我的公司设计一个联系人管理程序。我们有VS 2012,因为我从来没有使用过WPF之前,我想我会用它来开发这个应用程序。
我有巨大的问题开始对绑定时,利用实体框架的数据库,其中btw是数据库第一。
我已经按照这个链接中的指示去信了。http://msdn.microsoft.com/en-us/data/jj574514.aspx
对象在数据源窗口中显示得很好。但是当我拖放到我的窗口时,什么也没有发生。不知道我做错了什么,也找不到其他有这个问题的人。
有人能帮帮我吗?我到处都找过了。任何帮助都很感激

f1tvaqid

f1tvaqid1#

好吧。我实际上看了那篇文章,只是为了表示诚意,让你知道我真的想帮助你。
我得出以下结论:

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

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

  • Visual Studio WPF设计器生成固定大小、固定位置的UI。这些类型的UI在具有不同屏幕分辨率和DPI设置的计算机中执行时不能很好地工作。就像Winforms一样。
  • 它还产生了很多不必要的XAML(例如x:Name="categoryIdColumn"Margin="13,13,43,191"之类的东西,从可维护性/可伸缩性的Angular 来看,这些东西非常糟糕)
  • 从我所看到的,设计器生成的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),但是当涉及到添加复杂的DataBinding或UI逻辑时,你永远都会被winforms的无能所困扰。
  • WPF鼓励手动编写XAML,这不仅是因为XAML是声明式的(与过程式winforms方法相反),而且还因为可定制性和可重用性的级别非常高,以至于以设计器为中心的方法没有意义。

拖放是最简单的方法
不不是这其实是一种艰难的方式。简单的方法是学习XAML并能够执行Things you can't even imagine to do with winforms
如果以设计师为中心的方法对您仍然有意义,您可能想尝试Expression Blend

w8f9ii69

w8f9ii692#

从模型自动创建数据网格

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

**(能否,原作者“JWP”请提供一个链接到这本书或网页,这一技术是(希望)启发?一个提供更多辅导和背景的来源将提供一个更温和的学习曲线。

从这样做开始:在项目中创建一个名为Models的文件夹,然后首先使用Entity FrameworkDatabase-First(DB)或手动编写要显示的模型。
或者参见下面关于对象绑定的讨论...
在同一个文件夹中创建一个伪类,它是IEnumerable的一个属性,如下所示。

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

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

单击Object并找到上面刚刚创建的MyCollection属性。
现在在WPF中打开一个用户控件或窗口,但保持数据源工具箱打开。
它应该默认为DataGrid,但您可以右键单击数据源并将其更改为detail,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并查找CollectionViewSourceKEY属性,该属性也是在将该属性拖到XAML时插入的。它看起来像这样:

使用代码后面的Key名称,然后将CVS“绑定”到您的数据源,该数据源是MyClassModel类型的可枚举对象,它可以位于View Model中或视图的代码后面,如您所选。
如果您只使用CollectionViewSource作为网格的数据上下文,则不需要为任何底层集合实现**(的PropertyChanged事件和OnPropertyChanged方法)INotifyPropertyChanged接口**(INPC)!每次源代码更新时,CVS都会自动更新视图!一旦你掌握了这一点,你就可以在2分钟内创建数据的工作视图原型!忘记手工编写XAML,因为它需要太长的时间。

对象绑定

创建一个带有静态方法的静态类,该方法返回如下内容:

使用数据源向导时,选择“对象”选项。
单击“确定”,您应该会看到如下内容:

您已经将所有属性Map到了数据源定义中。

2izufjch

2izufjch3#

对于任何在VS 2022中发现此问题的人:根据这篇文章,VS 2022有一个已知的错误,无法将数据源拖放到XAML表单。
更多信息:https://developercommunity.visualstudio.com/t/drag-a-a-table-from-datasource-and-drop-in-a-windo/1660788
更新:它说修复程序已于6月15日发布。您可以尝试将VS 2022更新到最新版本。

相关问题