两个窗口连接到数据库,如何更新UI
本文关键字:UI 何更新 更新 两个 窗口 连接 数据库 | 更新日期: 2023-09-27 18:21:13
>我有两个窗口,一个用于添加用户,另一个用于查看所有用户,它们都连接了数据库。我想要的是,在我按下添加用户窗口中的添加按钮(在关闭它之前(后,在查看所有窗口中自动显示用户。
在查看所有窗口中(我仅提出数据绑定部分(:-
注意:
-
以下代码位于 MainWindows.xaml 的构造函数中。
-
基本上
ProfileControl
是一个自定义控件,profileList
ListBox
和profileCollection
是一个ObservableCollection
if (dbObj.GetDbData().Count != 0) { foreach (ProfileControl item in dbObj.GetDbData()) { profileCollection.Add(item); } this.profileList.DataContext = profileCollection; }
以下是列表框。
<ListBox Name="profileList" ItemsSource="{Binding}" IsSynchronizedWithCurrentItem="True">
<ListBox.ItemTemplate>
<DataTemplate>
<profileControl:ProfileControl Name="pcList" onClickUser="ProfileControl_onClickUser" />
</DataTemplate>
</ListBox.ItemTemplate>
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal" VerticalAlignment="Top"/>
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
</ListBox>
最后,以下是AddUser.xaml中的添加按钮。
注意:基本上,我首先检查我添加的用户是否签入。如果没有,我将其添加到数据库中。
private void addButton_Click(object sender, RoutedEventArgs e)
{
try
{
if (co.checkIfCheckedIn(memoryCard))
{
MessageBox.Show("The person is inside. ", "No Adding", MessageBoxButton.OK, MessageBoxImage.Stop);
}
else
{
co.AddData(memoryCard, emailTb.Text, contactNumberTb.Text, workPlaceTb.Text, infoTb.Text);
MessageBox.Show("Saving is done. ", "Saved", MessageBoxButton.OK, MessageBoxImage.Asterisk);
this.notificationTB.Text = " Saving is complete.";
}
}
catch (Exception ex)
{
this.notificationTB.Text = ex.Message;
this.notificationTB.Foreground = (Brush)new BrushConverter().ConvertFromString("White");
this.notificationTB.Background = (Brush)new BrushConverter().ConvertFromString("Red");
}
}
我想补充一点,它应该在我通过添加按钮保存数据后自动在 MainWindows 中显示用户,但事实并非如此。我必须关闭应用程序并再次打开它才能查看数据。我相信我需要访问 MainWindows.xaml 中的 ObservableCollection
对象profileCollection
才能执行此操作,但我不确定它是否正确以及如何执行此操作。
请告诉我,谢谢。
至少有 3 种解决方案,从最简单的(从教条式的"将它们全部解耦"POV 中很糟糕,但可以是务实的(到大规模管道(从设计 POV 中很好(:
1( 通过Application.Current.Resources
中的全局资源共享您的收藏:
Application.Current.Resources["MyUserCollection"] = theUserCollection;
2(使用两个视图共享的视图模型,公开用户集合;您通常会将其设置为两个视图的DataContext
3(使用消息代理通知主视图添加了新用户,您需要一些MVVM框架,例如MVVM Light或Caliburn Micro
编辑:这是另一个解决方案,这是一个很好的折衷方案:
4(在主窗口代码隐藏中公开Refresh
/Reload
方法:
public void ReloadUsers()
{
profileCollection.Clear();
var data = dbObj.GetDbData();
if (data.Count != 0)
{
foreach (ProfileControl item in data)
{
profileCollection.Add(item);
}
this.profileList.DataContext = profileCollection;
}
}
并从您的另一个窗口调用它:
private void addButton_Click(object sender, RoutedEventArgs e)
{
try
{
...
(Application.Current.MainWindow as MainWindow).ReloadUsers();
}
catch (Exception ex)
{
...
}
}