c# - 如何将一个窗口中的数据网格与另一个窗口中的文本框绑定?
问题描述
我正在尝试创建一个包含机场数据的主窗口,以及一个用于编辑数据的单独窗口。目前,我只能在同一个窗口中绑定数据网格和文本框,但是如何在 EditWindow 中绑定它们呢?
AirportsWindow(主窗口):
public partial class AirportsWindow : Window
{
public AirportsWindow()
{
InitializeComponent();
using (SQLiteConnection dataConnection = new SQLiteConnection())
{
try
{
dataConnection.ConnectionString = "Data Source=database.db;Version=3;";
dataConnection.Open();
SQLiteCommand dataCommand = new SQLiteCommand();
dataCommand.Connection = dataConnection;
}
catch (Exception e)
{
Console.WriteLine("Грешка при повезивању с базом " + e.Message);
}
}
string database_connection = "Data Source=database.db;Version=3;";
string query = String.Format("SELECT * FROM airports WHERE active = '1'");
SQLiteConnection connection = new SQLiteConnection(database_connection);
connection.Open();
SQLiteCommand command = new SQLiteCommand(query, connection);
SQLiteDataAdapter dataAdapter = new SQLiteDataAdapter(command);
DataTable data = new DataTable();
dataAdapter.Fill(data);
dgAirports.DataContext = data;
}
这是编辑窗口:
<Grid x:Name="FormGrid" DataContext="{Binding SelectedItem, ElementName=Dgrid}">
<Label x:Name="lblAirportId" Content="ИД" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="10,12,0,0"/>
<TextBox x:Name="txtAirportId" Text="{Binding ElementName=dgAirports, Path=SelectedValue.id}" HorizontalAlignment="Left" Height="23" TextWrapping="Wrap" VerticalAlignment="Top" Width="125" Margin="48,13,0,0"/>
<Label x:Name="lblAirportName" Content="Назив" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="0,38,0,0"/>
<TextBox x:Name="txtAirportName" Text="{Binding ElementName=dgAirports, Path=SelectedValue.airportName}" HorizontalAlignment="Left" Height="23" TextWrapping="Wrap" VerticalAlignment="Top" Width="125" Margin="48,41,0,0"/>
<Label x:Name="lblAirportCity" Content="Град" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="2,69,0,0"/>
<TextBox x:Name="txtAirportCity" Text="{Binding ElementName=dgAirports, Path=SelectedValue.airportCity}" HorizontalAlignment="Left" Height="23" TextWrapping="Wrap" VerticalAlignment="Top" Width="125" Margin="48,72,0,0"/>
<Button x:Name="btnEdit" Content="Додај" HorizontalAlignment="Left" Margin="10,100,0,0" VerticalAlignment="Top" Width="75" Click="btnEdit_Click"/>
<Button x:Name="btnCancel" Content="Одустани" HorizontalAlignment="Left" Margin="98,100,0,0" VerticalAlignment="Top" Width="75" Click="btnCancel_Click"/>
</Grid>
</Window>
这也是我在 AirportsWindow (主窗口)中完成和绑定的方式
<Grid>
<DataGrid x:Name="dgAirports" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top" Height="100" Width="272" ItemsSource="{Binding}" AutoGenerateColumns="False" CanUserAddRows="false" VerticalScrollBarVisibility="Hidden">
<DataGrid.Columns>
<DataGridTextColumn Header="Шифра" Binding="{Binding Path = id}" Width="*"/>
<DataGridTextColumn Header="Назив" Binding="{Binding Path = airportName}" Width="*"/>
<DataGridTextColumn Header="Град" Binding="{Binding Path = airportCity}" Width="*"/>
</DataGrid.Columns>
</DataGrid>
<Label x:Name="lblAirportId" Content="ИД" HorizontalAlignment="Left" Margin="123,115,0,0" VerticalAlignment="Top"/>
<TextBox x:Name="txtAirportId" Text="{Binding ElementName=dgAirports, Path=SelectedValue.id}" HorizontalAlignment="Left" Height="23" Margin="157,115,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="125"/>
<Label x:Name="lblAirportName" Content="Назив" HorizontalAlignment="Left" Margin="109,142,0,0" VerticalAlignment="Top"/>
<TextBox x:Name="txtAirportName" Text="{Binding ElementName=dgAirports, Path=SelectedValue.airportName}" HorizontalAlignment="Left" Height="23" Margin="157,143,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="125"/>
<Label x:Name="lblAirportCity" Content="Град" HorizontalAlignment="Left" Margin="115,168,0,0" VerticalAlignment="Top"/>
<TextBox x:Name="txtAirportCity" Text="{Binding ElementName=dgAirports, Path=SelectedValue.airportCity}" HorizontalAlignment="Left" Height="23" Margin="157,171,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="125"/>
<Button x:Name="btnAdd" Content="Додај" HorizontalAlignment="Left" Margin="10,115,0,0" VerticalAlignment="Top" Width="75" Click="btnAdd_Click"/>
<Button x:Name="btnEdit" Content="Измени" HorizontalAlignment="Left" Margin="10,142,0,0" VerticalAlignment="Top" Width="75" Click="btnEdit_Click"/>
<Button x:Name="btnDelete" Content="Избриши" HorizontalAlignment="Left" Margin="10,170,0,0" VerticalAlignment="Top" Width="75" Click="btnDelete_Click"/>
</Grid>
</Window>
解决方案
您应该使用 MVVM 模式,或者至少部分使用背后的想法。
模型:
public class MyModel
{
public string MyProperties { get; set; }
}
主窗口:
public partial class Window1 : Window
{
public MyModel Model { get; set; }
public Window1()
{
InitializeComponent();
// Only time creating an instance of MyModel
Model = new MyModel();
Model.MyProperties = string.Empty;
// Pass reference of MyModel to other Windows (or even better ViewModels)
Window2 wnd = new Window2(Model);
wnd.Show();
MessageBox.Show(Model.MyProperties);
// Output: "This is an example."
}
}
子窗口:
public partial class Window2 : Window
{
// Don't create another instance, just pass the existing instance reference
public MyModel Model { get; set; }
public Window2(MyModel model)
{
InitializeComponent();
Model = model;
// Modifying Properties from here will also update in Window1
Model.MyProperties = "This is an example.";
}
}
推荐阅读
- mysql - Mysql Inner Join Group By教程问题
- c - 我试图让用户点击
退出我的 C 程序的键 - regex - 如何在 MongoDB 中使用条件查询
- javascript - 如何根据列表中的标签链接提交按钮?
- swiftui - 如何在 SwiftUI 中为函数定义默认的空输入内容?
- python - Python 命令行中的语法“SOME_VAR=/some/path python pythonFile.py”是什么?
- java - 我无法截断要比较的数字
- reactjs - Webpack/Babel/React 项目上的“当前未启用对实验语法 'jsx' 的支持”
- tensorflow - 如何在下面的代码中找到分配给验证集的每个图像的标签?
- android - Android 10 及更高版本的 Scoped Storage 应用程序崩溃,将图像上传到服务器