两个窗口连接到数据库,如何更新UI

本文关键字:UI 何更新 更新 两个 窗口 连接 数据库 | 更新日期: 2023-09-27 18:21:13

>我有两个窗口,一个用于添加用户,另一个用于查看所有用户,它们都连接了数据库。我想要的是,在我按下添加用户窗口中的添加按钮(在关闭它之前(后,在查看所有窗口中自动显示用户。

在查看所有窗口中(我仅提出数据绑定部分(:-

注意:

  • 以下代码位于 MainWindows.xaml 的构造函数中。

  • 基本上ProfileControl是一个自定义控件,profileList ListBoxprofileCollection是一个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才能执行此操作,但我不确定它是否正确以及如何执行此操作。

请告诉我,谢谢。

两个窗口连接到数据库,如何更新UI

至少有 3 种解决方案,从最简单的(从教条式的"将它们全部解耦"POV 中很糟糕,但可以是务实的(到大规模管道(从设计 POV 中很好(:

1( 通过Application.Current.Resources中的全局资源共享您的收藏:

Application.Current.Resources["MyUserCollection"] = theUserCollection;

2(使用两个视图共享的视图模型,公开用户集合;您通常会将其设置为两个视图的DataContext

3(使用消息代理通知主视图添加了新用户,您需要一些MVVM框架,例如MVVM LightCaliburn 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)
    {
        ...
    }
}