我有两个窗口,一个用于添加用户,另一个用于查看所有用户,两者都连接数据库。我想要的是在我添加用户窗口中的添加按钮之后(在关闭之前)在视图中的所有窗口中自动显示用户。
在视图中所有窗口(我只构成数据绑定部分): -
注意:
以下代码位于 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。
<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
来执行此操作,但我不确定它是否正确以及如何。
请告诉我,谢谢。
答案 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)
{
...
}
}