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

时间:2014-09-08 10:19:01

标签: c# wpf xaml data-binding observablecollection

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

在视图中所有窗口(我只构成数据绑定部分): -

注意:

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

  • 基本上ProfileControl是自定义控件,profileListListBoxprofileCollectionObservableCollection

    if (dbObj.GetDbData().Count != 0)
    {
        foreach (ProfileControl item in dbObj.GetDbData())
        {
            profileCollection.Add(item);
        }
        this.profileList.DataContext = profileCollection;
    }
    

以下是ListBox。

<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来执行此操作,但我不确定它是否正确以及如何。

请告诉我,谢谢。

1 个答案:

答案 0 :(得分:1)

至少有3种解决方案,从最简单的(从教条的“将它们全部解耦”POV,但可以是务实的)到大规模管道(从设计POV中获益):

1)通过Application.Current.Resources中的全球资源分享您的馆藏:

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

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

3)使用消息代理通知主视图添加了新用户,你需要一些 MVVM框架,就像 MVVM Light一样 Caliburn Micro


编辑:这是另一个妥协的解决方案:

4)在您的MainWindow代码隐藏中公开了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)
    {
        ...
    }
}