Обновить сетку данных в UserControl - PullRequest
0 голосов
/ 08 мая 2018

Я изучаю c # и wpf, и я не знаю, как справиться с чем-то вроде этого:

У меня есть 2 окна (одно с пользовательским контролем) и 1 класс.

Window1

    List<Reservation> reservationList = new List<Reservation>();
    private void ToggleButton_Checked(object sender, RoutedEventArgs e)
        {
            var button = (ToggleButton)sender;
            var item = button.DataContext as Hall;
            Reservation nres = new Reservation();
            nres.movieName = item.moviename;
            nres.seat = item.number;
            nres.rowID = item.row;
            reservationList.Add(nres);
        }

        private void Add_Button_Click(object sender, RoutedEventArgs e)
        {
        }

Класс содержит

 class Reservation
{
    public string movieName { get; set; }
    public int seat { get; set; }
    public string rowID { get; set; }
}

Window2 имеет UserControl с сеткой данных.

Не могли бы вы дать мне несколько советов о том, как привязать сетку usercontrol window2 к списку, созданному в window1, и когда я нажимаю кнопку ADD в window1, он обновляет этот usercontrol и отображает фактические позиции в списке window1.

Надеюсь на ваше понимание и заранее благодарю!

Ответы [ 2 ]

0 голосов
/ 08 мая 2018

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

Чтобы ответить на ваш первый вопрос, все, что вам нужно сделать, чтобы связать список с DataGrid, - это присвоить список свойству DataGrid ItemsSource. Например (см. Метод MainWindow ниже):

dataGridReservations.ItemsSource = reservations.List;

Я новичок в WPF, но похоже, что поведение по умолчанию для DataGrid заключается в создании имен столбцов из имен переменных в списке.

Вы хотите реализовать свой список резервирований как ObservableCollection, поскольку ObservableCollection автоматически распространяет изменения в сетке данных при добавлении, удалении или изменении элемента в связанном списке. См. Как связать список с сеткой данных WPF?

По второму вопросу: используйте событие нажатия кнопки Add, чтобы добавить название фильма, номер места и идентификатор строки из текстовых полей к новому элементу в списке. Опять же, когда список обновляется, DataGrid обновляется из-за действия ObservableCollection

Вот код, который позволяет пользователю ввести название фильма, номер места и идентификатор строки, а затем нажать кнопку «Добавить», чтобы добавить его к DataGrid. Требуется больше кода, чтобы пользователь мог редактировать или удалять элемент в сетке.

XAML следует коду

См. Снимок экрана внизу для демонстрации

public partial class MainWindow : Window
{

    Reservations reservations;

    public MainWindow()
    {
        InitializeComponent();

        reservations = new Reservations();

        dataGridReservations.ItemsSource = reservations.List;
    }

    public class Reservations
    {
        public class Reservation
        {
            private string _movieName;
            private string _seat;
            private string _rowID;

            public Reservation(string movieName, string seat, string rowID)
            {
                MovieName = movieName;
                Seat = seat;
                RowID = rowID;
            }

            public string MovieName { get => _movieName; set => _movieName = value; }
            public string Seat { get => _seat; set => _seat = value; }
            public string RowID { get => _rowID; set => _rowID = value; }
        }

        private ObservableCollection<Reservation> _list;

        public ObservableCollection<Reservation> List { get => _list; set => _list = value; }

        public Reservations()
        {
            List = new ObservableCollection<Reservation>();
        }

        public void AddReservationToList(string MovieName, string SeatNumber, string RowId)
        {
            Reservation reservation = new Reservation(MovieName, SeatNumber, RowId);
            List.Add(reservation);
        }

    }

    private void ButtonAddReservationToList(object sender, RoutedEventArgs e)
    {
        reservations.AddReservationToList(textBoxMovieName.Text, textBoxSeatNumber.Text, textBoxRowId.Text);
        textBoxMovieName.Text = "";
        textBoxSeatNumber.Text = "";
        textBoxRowId.Text = "";
    }
}

MainWindow XAML

    <Window x:Class="SO_Refresh_datagrid.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:SO_Refresh_datagrid"
            mc:Ignorable="d"
            Title="MainWindow" Height="350" Width="525">
        <Grid>
            <Button Content="Add" HorizontalAlignment="Left" Height="30" Margin="83,169,0,0" VerticalAlignment="Top" Width="64" Click="ButtonAddReservationToList"/>
            <TextBox x:Name="textBoxMovieName" HorizontalAlignment="Left" Height="31" Margin="140,18,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="103"/>
            <TextBox x:Name="textBoxSeatNumber" HorizontalAlignment="Left" Height="24" Margin="140,61,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="103"/>
            <TextBox x:Name="textBoxRowId" HorizontalAlignment="Left" Height="24" Margin="140,100,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="103"/>
            <Label Content="Movie Name" HorizontalAlignment="Left" Height="31" Margin="36,18,0,0" VerticalAlignment="Top" Width="71"/>
            <Label Content="Seat Number" HorizontalAlignment="Left" Height="31" Margin="36,61,0,0" VerticalAlignment="Top" Width="90"/>
            <Label Content="Row Id" HorizontalAlignment="Left" Height="31" Margin="36,100,0,0" VerticalAlignment="Top" Width="71"/>
            <DataGrid x:Name="dataGridReservations" HorizontalAlignment="Left" Height="284" Margin="277,18,0,0" VerticalAlignment="Top" Width="209"/>
    
        </Grid>
    </Window>
    

Демо

enter image description here

0 голосов
/ 08 мая 2018

Чтобы отразить изменения в коллекции, ваша коллекция должна быть коллекцией Observable. Посмотрите в этой статье, как использовать наблюдаемую коллекцию: https://www.c -sharpcorner.com / UploadFile / e06010 / observablecollection-in-wpf / .

Этот вопрос является хорошим примером, который можно использовать для просмотра привязки сетки данных: Связывание сетки данных MVVM Когда вы добавите новое резервирование в свой bookingList (который вы делаете Observable), изменение будет отражено в интерфейсе пользователя. Я надеюсь, что это поможет.

При работе с WPF вы должны следовать шаблону MVVM, потому что это облегчит вашу жизнь. См. Некоторые учебные ссылки здесь: MVVM: учебное пособие от начала до конца? Надеюсь, это поможет.

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