如何像使用Winforms中的BindingSources一样,使用Entity Framework处理WPF中的数据?

时间:2018-08-09 22:30:18

标签: wpf entity-framework

我试图在Winforms中重新创建一个现有的WPF项目,并且还开始学习MVVM模式。

Winforms项目中,我有2个DataGridViews。一个包含一个联系人列表,另一个包含链接到所选联系人的电话号码。

用户可以添加/删除/编辑电话号码,然后在form结束时将提示他们进行任何更改。

到目前为止,我已经将项目推进到一个阶段,可以循环浏览DataGrid中的联系人,并在第二个DataGrid中显示相关的电话号码。

在使用Winforms的{​​{1}}项目中,我所做的所有更改都将保留,直到我关闭BindingSources并可以调用Form为止。我的MyBindingSource.HasChanges()版本尚未能够做到这一点。

在过去的一两个星期中,我尝试了很多次,试图弄清楚我如何实现自己想要的目标,但到目前为止却失败了。我的主要问题是我不确定如何像这样处理WPF  Data可以。我可以将其全部保存在表中,并且如果BindingSource关闭时valuestable中的任何table.Count已更改,则提示保存。

距离我最近的是将我所有的电话号码加载到Window中,然后尝试根据所选联系人过滤该集合。我添加了ObservableCollection个事件  到集合中的每个PropertyChanged以进行任何编辑,并向item发起CollectionChanged事件以检测任何添加或删除。整个事情真的很乱  而且我认为我一定做错了,这样会更容易(不太复杂)。

我也曾尝试致电ObservableCollectioncontext.ChangeTracker.DetectChanges();,但我只是以为我错过了一些东西,却无法在所有谷歌搜索中找到什么内容。

我很欣赏它可能真的很简单,但是当您不知道时,您就是不知道。我可以发表自己的尝试,但我担心我的问题将是巨大的,并且代码太多,任何人都无法阅读。

因此,我再次启动了我的应用程序,并使其保持了非常基本的状态,以便在此处提出我的问题。我在这里意识到,我的代码将不会保留任何更改,因为它会在SelectedContactItemChanged上获得context.ChangeTracker.HasChanges();, 但是出于我的问题,我只是想把它做到这一点。

到目前为止,这是我的代码:

查看

Data

ViewModel

 <Window x:Class="mvvmTest.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:mvvmTest"
        mc:Ignorable="d"
        DataContext="{DynamicResource vmMainWindow}"
        Title="MainWindow" Height="450" Width="800">
    <Window.Resources>
        <local:vmMainWindow x:Key="vmMainWindow"/>
    </Window.Resources>
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="300" />
            <ColumnDefinition Width="*" />
            <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>
        <DataGrid
            AutoGenerateColumns="False"
            CanUserAddRows="False"
            ItemsSource="{Binding Contacts}"
            SelectedItem="{Binding SelectedContactItem, Mode=TwoWay}">
            <DataGrid.Columns>
                <DataGridTextColumn Header="Name" Binding="{Binding strContactFirstName}" Width="*" />
            </DataGrid.Columns>
        </DataGrid>
        <DataGrid
            AutoGenerateColumns="False"
            Grid.Column="1"
            CanUserAddRows="False"
            ItemsSource="{Binding ContactPhones}">
            <DataGrid.Columns>
                <DataGridTextColumn Header="Phone Number" Binding="{Binding strContactPhoneNumber}" Width="*" />
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</Window>

我基本上从哪里去?我并不一定要寻找确切的答案,但希望有一些指导或建议(指向正确的方向)也许我要达到的目标是不好的做法。 我应该只在每次添加/删除/编辑时保存它们吗?我喜欢这样的想法:可以对using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel; using System.Linq; using System.Text; using System.Threading.Tasks; namespace mvvmTest { public class vmMainWindow: vmBase, INotifyPropertyChanged { private ObservableCollection<tblContact> _contacts; public ObservableCollection<tblContact> Contacts { get { return _contacts; } set { _contacts = value; NotifyPropertyChanged(); } } private tblContact _selectedContactItem; public tblContact SelectedContactItem { get { return _selectedContactItem; } set { _selectedContactItem = value; NotifyPropertyChanged(); SelectedContactItemChanged(); } } private ObservableCollection<tblContactPhone> _contactPhones; public ObservableCollection<tblContactPhone> ContactPhones { get { return _contactPhones; } set { _contactPhones = value; NotifyPropertyChanged(); } } public vmMainWindow() { using (MyEntities context = new MyEntities()) { IQueryable<tblContact> contactData = from c in context.tblContacts where c.fk == 25588 && c.blDeleted == false select c; Contacts = new ObservableCollection<tblContact>(contactData.ToList()); } } private void SelectedContactItemChanged() { using (MyEntities context = new MyEntities()) { IQueryable<tblContactPhone> phoneData = from c in context.tblContactPhones where c.fkContact == SelectedContactItem.pkContact && c.blDeleted == false select c; ContactPhones = new ObservableCollection<tblContactPhone>(phoneData.ToList()); } } } } 做任何事,然后可以选择一次保存所有内容 如果我想什么时候结束。

感谢所有花时间阅读本文的人!

0 个答案:

没有答案