Как связать сетку данных из одного окна с текстовыми полями в другом окне? - PullRequest
0 голосов
/ 03 декабря 2018

Я пытаюсь создать одно главное окно с данными аэропортов и одно отдельное окно для редактирования данных.В настоящее время я могу связывать таблицы данных и текстовые поля только в одном окне, но как связать их в EditWindow?

airportWindow (главное окно):

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;

        }

А вот EditWindow:

<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>

Также вот как я это сделал и связал в окне Аэропорты (главное окно)

<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>

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

Вам следует использовать шаблон MVVM или, по крайней мере, часть идеи, лежащей в основе.

Модель:

public class MyModel
{
    public string MyProperties { get; set; }
}

MainWindow:

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.";
    }
}
0 голосов
/ 03 декабря 2018

Используйте ICommand или RelayCommand, реализованные в контексте данных главного окна, и установите выбранный элемент в качестве контекста данных окна редактирования.Вы можете передать его в качестве параметра через конструктор окна редактирования.

Проблема в текущей реализации заключается в том, что вы обращаетесь к элементу по имени (Dgrid) из отдельного xaml.

Мое предложение состоит в том, чтобы попытаться реализовать вашприложение с использованием шаблона MVVM.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...