我在主窗口有一个数据网格。当我点击"添加"按钮时,它会打开一个名为"AddDetails"的新窗口。它接受用户输入,如姓名、年龄、城市。我在adddetails . example .cs中创建了一个类"PersonalInfo"来定义字段。当我点击"AddDetails"窗口中的"submit"按钮时,我的数据网格应该使用用户输入值进行更新。我需要帮助如何做到这一点,而不实现MVVM架构。问题是当我点击"提交"按钮时,它每次都会打开一个新窗口,并在网格中添加详细信息。此外,之前添加的输入也不存在。我想要的是在主窗口中显示所有用户输入。
MainWindow.xaml:
<Window x:Class="WPF_Practice.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:WPF_Practice"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Grid>
<DataGrid x:Name="DataGrid1" ColumnWidth="200" HorizontalAlignment="Left" Height="244" Margin="117, 65, 0,0" VerticalAlignment="Top" Width="522" IsReadOnly="True">
<DataGrid.Columns>
<DataGridTextColumn Header="Name" Binding="{Binding _name}" Width="130"/>
<DataGridTextColumn Header="Age" Binding="{Binding _name}" Width="130"/>
<DataGridTextColumn Header="City" Binding="{Binding _name}" Width="*"/>
</DataGrid.Columns>
</DataGrid>
<Button x:Name="ADD" Click="ADD_Click" Content="ADD" HorizontalAlignment="left" VerticalAlignment="Top" Margin="127,335,0,0" Width="74"/>
</Grid>
MainWindow.xaml.cs:
public partial class MainWindow : Window
{
public MainWindow()
{
}
public MainWindow(PersonalInfo personal)
{
InitializeComponent();
DataGrid1.Items.Add(personal);
}
private void ADD_Click(object sender, RoutedEventArgs e)
{
AddDetails addDetails = new AddDetails();
addDetails.Show();
}
}
AddDetails.xaml:
<Window x:Class="WPF_Practice.AddDetails"
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:WPF_Practice"
mc:Ignorable="d"
Title="AddDetails" Height="450" Width="800">
<Grid>
<Button Content="Submit" HorizontalAlignment="Left" Margin="276,248,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click"/>
<Label Content="Name" HorizontalAlignment="Left" Margin="216,101,0,0" VerticalAlignment="Top"/>
<Label Content="Age" HorizontalAlignment="Left" Margin="216,147,0,0" VerticalAlignment="Top"/>
<Label Content="City" HorizontalAlignment="Left" Margin="216,186,0,0" VerticalAlignment="Top"/>
<TextBox x:Name="Name" HorizontalAlignment="Left" Height="23" Margin="334,113,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120"/>
<TextBox x:Name="Age" HorizontalAlignment="Left" Height="23" Margin="334,159,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120"/>
<TextBox x:Name="City" HorizontalAlignment="Left" Height="23" Margin="334,198,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120"/>
</Grid>
AddDetails.xaml.cs:
public partial class AddDetails : Window
{
PersonalInfo personal = new PersonalInfo();
public AddDetails()
{
InitializeComponent();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
this.Hide();
personal.name = Name.Text;
personal.age = Convert.ToInt32(Age.Text);
personal.city = City.Text;
MainWindow mainWindow = new MainWindow(personal);
mainWindow.Show();
}
public class PersonalInfo
{
public string name { get; set; }
public int age { get; set; }
public string city { get; set; }
}
}
下面是我对对话框的实现:(EDIT)
private void ADD_Click(object sender, RoutedEventArgs e)
{
Dialogue dialogue = new Dialogue();
if(dialogue.ShowDialog() == true)
{
PersonalInfo._name = dialogue.Name.Text;
PersonalInfo._age= Convert.ToInt32(dialogue.Age.Text);
PersonalInfo._city= dialogue.CityText;
if(dialogue.Name.Text.Length == 0)
{
MessageBox.Show(“Please fill all the details”);
}
DataGrid1.Items.Add(personalInfo);
}
消息框正在显示。但是当它打开时,对话窗口会自动关闭。我不希望对话窗口关闭,当消息框显示。这样,当我点击消息框上的"确定"时,我应该能够回到我的对话窗口并编辑字段。
提前感谢。
您当前在窗口之间导航的方式,在按下submit后预计会出现MainWindow的新实例(这也意味着,您之前的数据将被丢弃):
每次你创建一个新的AddDetails
窗口,AddDetails实例的PersonalInfo
被分配一个全新的对象。
PersonalInfo personal = new PersonalInfo();
当显示AddDetails页面时,每次创建一个新的AddDetails对象:
private void ADD_Click(object sender, RoutedEventArgs e)
{
AddDetails addDetails = new AddDetails();
addDetails.Show();
}
当你从AddDetails窗口导航回来时,你创建了一个全新的主窗口来导航回去:
private void Button_Click(object sender, RoutedEventArgs e)
{
this.Hide();
personal.name = Name.Text;
personal.age = Convert.ToInt32(Age.Text);
personal.city = City.Text;
MainWindow mainWindow = new MainWindow(personal); //<-- new MainWindow instance
mainWindow.Show();
}
有多种方法可以避免这种情况:
处理新的Window实例,并在构造函数或load事件中填充它们的数据。如果你想让你的数据存储在windows实例之间,你必须以一种持久的方式存储它们。每次卸载主窗口对象时,其中的所有数据都会随之消失,包括对其他窗口的引用。例如,静态字段或直接存储在应用程序类中的任何数据都是例外。
保持您的窗口实例本身以上述方式存储。如果您有一个MainWindow类型的静态属性,并在应用程序运行时开始时为其分配当前窗口,您可以简单地重用它。
这两种解决方案都没有考虑到像WPF这样的大型框架所带来的特性。我的建议是切换到以下解决方案之一:
1:使用导航窗口。如果你的主窗口是一个导航窗口而不是一个窗口,你可以很容易地在页面之间导航。AddDetails不是窗口,而是页面,例如:
`public partial class AddDetails : Page`
`<Page x:Class="WPF_Practice.AddDetails"...`
2:使用对话框而不是窗口来显示AddDetails。对话框是一个非常有用的WPF特性,您可以在其中显示任何控件,就像显示警报一样。它将在当前窗口的顶部显示一个新窗口,该窗口必须在初始窗口可以再次交互之前提交,例如:
private void ADD_Click(object sender, RoutedEventArgs e)
{
AddDetails addDetails = new AddDetails();
if (addDetails.ShowDialog() == true)
{
//do something after the user pressed "submit"
}
}
在这种情况下,你所要做的就是告诉你的AddDetails对话框,当它被认为完成了。例如:
private void Button_Click(object sender, RoutedEventArgs e)
{
DialogResult = true; //true means success, false means dialog was canceled
}