我试图在Winforms
中重新创建一个现有的WPF
项目,并且还开始学习MVVM
模式。
在Winforms
项目中,我有2个DataGridViews
。一个包含一个联系人列表,另一个包含链接到所选联系人的电话号码。
用户可以添加/删除/编辑电话号码,然后在form
结束时将提示他们进行任何更改。
到目前为止,我已经将项目推进到一个阶段,可以循环浏览DataGrid
中的联系人,并在第二个DataGrid
中显示相关的电话号码。
在使用Winforms
的{{1}}项目中,我所做的所有更改都将保留,直到我关闭BindingSources
并可以调用Form
为止。我的MyBindingSource.HasChanges()
版本尚未能够做到这一点。
在过去的一两个星期中,我尝试了很多次,试图弄清楚我如何实现自己想要的目标,但到目前为止却失败了。我的主要问题是我不确定如何像这样处理WPF
Data
可以。我可以将其全部保存在表中,并且如果BindingSource
关闭时values
或table
中的任何table.Count
已更改,则提示保存。
距离我最近的是将我所有的电话号码加载到Window
中,然后尝试根据所选联系人过滤该集合。我添加了ObservableCollection
个事件
到集合中的每个PropertyChanged
以进行任何编辑,并向item
发起CollectionChanged
事件以检测任何添加或删除。整个事情真的很乱
而且我认为我一定做错了,这样会更容易(不太复杂)。
我也曾尝试致电ObservableCollection
和context.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());
}
}
}
}
做任何事,然后可以选择一次保存所有内容
如果我想什么时候结束。
感谢所有花时间阅读本文的人!