WPF 将数据从一个 window 传递到另一个
WPF passing data from one window to another
我有一个程序,我从 CSV 加载数据并将它们保存到列表中。然后我将它们加载到列表框和文本框。我创建了 "New" 按钮来向列表中添加新项目并在列表框和文本框中显示新项目。但是每次我创建新项目时,我都会删除以前的列表。谁能帮助我如何添加新项目并保留我的所有数据?
第二个window:
public partial class New : Window
{
AddDataFromImport data = new AddDataFromImport();
private string centName;
private string centCode;
private string centDesc;
public New()
{
InitializeComponent();
}
private void BtnSave_Click(object sender, RoutedEventArgs e)
{
Validate();
MainWindow mainWindow = new MainWindow(centName,centCode,centDesc);
mainWindow.Show();
this.Close();
}
}
第二个windowXML:
<Button x:Name="BtnSave" Content="Save" Grid.Row="5" Grid.Column="1" Width="150" Height="30" Click="BtnSave_Click"></Button>
主要window:
public partial class MainWindow : Window
{
public AddDataFromImport meetingData = new AddDataFromImport();
private Centre selectedCentre = null;
private Room selectedRoom = null;
public MainWindow()
{
InitializeComponent();
}
public MainWindow(string nameNewCent, string codeNewCent, string descNewCent) : this()
{
Centre cent = new Centre(nameNewCent, codeNewCent, descNewCent);
meetingData.MeetingCentres.Add(cent);
ListOfCentres.ItemsSource = meetingData.MeetingCentres;
}
private void SelectCheck(object sender, EventArgs e)
{
MyCheckBox.IsChecked = true;
}
// Load import
private void ImportData_Click(object sender, RoutedEventArgs e)
{
Microsoft.Win32.OpenFileDialog openFileDlg = new Microsoft.Win32.OpenFileDialog();
Nullable<bool> result = openFileDlg.ShowDialog();
if (result == true)
{
var filename = openFileDlg.FileName;
meetingData.CreateDataStrucuturtes(filename);
ListOfCentres.ItemsSource = meetingData.MeetingCentres;
}
}
// Fill center columns
public void ListOfCentres_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
selectedCentre = (Centre)ListOfCentres.SelectedItem;
if (selectedCentre != null)
{
TBoxName.Text = selectedCentre.Name;
TBoxCode.Text = selectedCentre.Code;
TBoxDescription.Text = selectedCentre.Description;
}
}
// Fill rooms from selected centre
private void TBoxName_TextChanged(object sender, TextChangedEventArgs e)
{
if ((Centre)ListOfCentres.SelectedItem != null)
ListOfRooms.ItemsSource = ((Centre)ListOfCentres.SelectedItem).RoomsInCentre;
}
// Create new centre
private void BtnNew_Click(object sender, RoutedEventArgs e)
{
New newWindow = new New();
newWindow.Show();
}
}
主要windowXML:
<StackPanel HorizontalAlignment="Left" Height="120" Margin="10,51,0,0" VerticalAlignment="Top" Width="340">
<ListBox x:Name="ListOfCentres" DisplayMemberPath="CenterName" Height="119" HorizontalAlignment="Left" Width="340" ItemsSource="{Binding Path=Centres}" SelectionChanged="ListOfCentres_SelectionChanged"/>
</StackPanel>
<Button x:Name="BtnNew" Content="New" Width="70" Margin="0,5,0,0" Height="21" Click="BtnNew_Click"></Button>
编辑: 我强烈建议你去学习更多(不一定是 C#)编程的基础知识,并阅读MVVM 设计模式,但如果你真的想这样做,我不会阻止你
一个解决方案(虽然可能有点矫枉过正)是使用 Callback
方法。基本上,我们为 New
window 的构造函数提供一个方法,并在我们想要保存新创建的 Centre
时执行该函数
您的新 window 将如下所示:
private Action<Centre> _callback;
public New(Action<Centre> callback)
{
InitializeComponent();
_callback = callback;
}
private void BtnSave_Click(object sender, RoutedEventArgs e)
{
if (Validate());
{
callback(new Centre(centName, centCode, centDesc);
this.Close();
}
else
MessageBox.Show("Something didn't validate");
}
你的 MainWindow 代码应该是这样的:
private void AddNewCentre(Centre centre)
{
meetingData.MeetingCentres.Add(centre);
}
private void BtnNew_Click(object sender, RoutedEventArgs e)
{
New newWindow = new New(AddNewCentre);
newWindow.Show();
}
说明: 使用 delegates
(就像我们正在使用的 Action
),您可以将方法作为参数传递。在这里,我们传递了将新中心添加到新视图的方法。添加完新中心后,我们 Validate();
(我假设这会验证输入的数据,如果数据正确,returns 布尔值 true/false),如果我们成功做到这一点我们调用我们作为参数提供的方法,将新中心添加到列表中,然后关闭 window
我有一个程序,我从 CSV 加载数据并将它们保存到列表中。然后我将它们加载到列表框和文本框。我创建了 "New" 按钮来向列表中添加新项目并在列表框和文本框中显示新项目。但是每次我创建新项目时,我都会删除以前的列表。谁能帮助我如何添加新项目并保留我的所有数据?
第二个window:
public partial class New : Window
{
AddDataFromImport data = new AddDataFromImport();
private string centName;
private string centCode;
private string centDesc;
public New()
{
InitializeComponent();
}
private void BtnSave_Click(object sender, RoutedEventArgs e)
{
Validate();
MainWindow mainWindow = new MainWindow(centName,centCode,centDesc);
mainWindow.Show();
this.Close();
}
}
第二个windowXML:
<Button x:Name="BtnSave" Content="Save" Grid.Row="5" Grid.Column="1" Width="150" Height="30" Click="BtnSave_Click"></Button>
主要window:
public partial class MainWindow : Window
{
public AddDataFromImport meetingData = new AddDataFromImport();
private Centre selectedCentre = null;
private Room selectedRoom = null;
public MainWindow()
{
InitializeComponent();
}
public MainWindow(string nameNewCent, string codeNewCent, string descNewCent) : this()
{
Centre cent = new Centre(nameNewCent, codeNewCent, descNewCent);
meetingData.MeetingCentres.Add(cent);
ListOfCentres.ItemsSource = meetingData.MeetingCentres;
}
private void SelectCheck(object sender, EventArgs e)
{
MyCheckBox.IsChecked = true;
}
// Load import
private void ImportData_Click(object sender, RoutedEventArgs e)
{
Microsoft.Win32.OpenFileDialog openFileDlg = new Microsoft.Win32.OpenFileDialog();
Nullable<bool> result = openFileDlg.ShowDialog();
if (result == true)
{
var filename = openFileDlg.FileName;
meetingData.CreateDataStrucuturtes(filename);
ListOfCentres.ItemsSource = meetingData.MeetingCentres;
}
}
// Fill center columns
public void ListOfCentres_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
selectedCentre = (Centre)ListOfCentres.SelectedItem;
if (selectedCentre != null)
{
TBoxName.Text = selectedCentre.Name;
TBoxCode.Text = selectedCentre.Code;
TBoxDescription.Text = selectedCentre.Description;
}
}
// Fill rooms from selected centre
private void TBoxName_TextChanged(object sender, TextChangedEventArgs e)
{
if ((Centre)ListOfCentres.SelectedItem != null)
ListOfRooms.ItemsSource = ((Centre)ListOfCentres.SelectedItem).RoomsInCentre;
}
// Create new centre
private void BtnNew_Click(object sender, RoutedEventArgs e)
{
New newWindow = new New();
newWindow.Show();
}
}
主要windowXML:
<StackPanel HorizontalAlignment="Left" Height="120" Margin="10,51,0,0" VerticalAlignment="Top" Width="340">
<ListBox x:Name="ListOfCentres" DisplayMemberPath="CenterName" Height="119" HorizontalAlignment="Left" Width="340" ItemsSource="{Binding Path=Centres}" SelectionChanged="ListOfCentres_SelectionChanged"/>
</StackPanel>
<Button x:Name="BtnNew" Content="New" Width="70" Margin="0,5,0,0" Height="21" Click="BtnNew_Click"></Button>
编辑: 我强烈建议你去学习更多(不一定是 C#)编程的基础知识,并阅读MVVM 设计模式,但如果你真的想这样做,我不会阻止你
一个解决方案(虽然可能有点矫枉过正)是使用 Callback
方法。基本上,我们为 New
window 的构造函数提供一个方法,并在我们想要保存新创建的 Centre
您的新 window 将如下所示:
private Action<Centre> _callback;
public New(Action<Centre> callback)
{
InitializeComponent();
_callback = callback;
}
private void BtnSave_Click(object sender, RoutedEventArgs e)
{
if (Validate());
{
callback(new Centre(centName, centCode, centDesc);
this.Close();
}
else
MessageBox.Show("Something didn't validate");
}
你的 MainWindow 代码应该是这样的:
private void AddNewCentre(Centre centre)
{
meetingData.MeetingCentres.Add(centre);
}
private void BtnNew_Click(object sender, RoutedEventArgs e)
{
New newWindow = new New(AddNewCentre);
newWindow.Show();
}
说明: 使用 delegates
(就像我们正在使用的 Action
),您可以将方法作为参数传递。在这里,我们传递了将新中心添加到新视图的方法。添加完新中心后,我们 Validate();
(我假设这会验证输入的数据,如果数据正确,returns 布尔值 true/false),如果我们成功做到这一点我们调用我们作为参数提供的方法,将新中心添加到列表中,然后关闭 window