Branden Coker Ответов: 1

Wpf-передача идентификатора из конструктора в событие нажатия кнопки.


Добрый вечер всем,

Я создаю навигационное приложение WPF. Я использую Entity Framework 6 для своего уровня персистентности. У меня есть свои страницы. Моя структура базы данных состоит из двух таблиц с отношением "один ко многим". У вас есть обвиняемый, а у обвиняемого может быть несколько свидетелей. ID для таблицы ответчика - это просто ID, в таблице свидетеля есть ID и MasterID (ссылки обратно на DefendantId). Поэтому у вас не может быть свидетеля, если нет обвиняемого, к которому вы могли бы его прикрепить. Я приложу код, который уже пробовал. Я не могу получить идентификатор, который передается в конструктор initialize, вплоть до моего события нажатия кнопки
<pre lang="c#">private void AddWitness(object sender, RoutedEventArgs e)</pre>

и мне нужно добавить нового свидетеля. Однако идентификатор передается конструктору. Пожалуйста помочь. Заранее спасибо.

- Бранден

Что я уже пробовал:

public partial class DefendantView : Page
   {
       public DefendantView(int ID)
       {
           InitializeComponent();
           GetDefendantById(ID);

           int MasterId = ID;
       }

       public void GetDefendantById(int ID)
       {
           using(DataController context = new DataController())
           {
               DefendantModel defendant = context.GetDefendantById(ID);
               grdDefendantDetails.DataContext = defendant;
           }
       }

       private void AddWitness(object sender, RoutedEventArgs e)
       {
           int defId = (int)sender;

           DefendantModel st = new DefendantModel();
           defId = Convert.ToInt32(st.ID);
           this.NavigationService.Navigate(new AddWitnessView(defId));
       }

1 Ответов

Рейтинг:
0

Jon McKee

Хм, я не уверен, что это основные проблемы, но некоторые проблемы я заметил:

public partial class DefendantView : Page
{
    public int MasterId { get; private set; }

    public DefendantView(int ID)
    {
        InitializeComponent();
        GetDefendantById(ID);

        //You aren't persisting MasterId to anything, it goes out of scope.
        //int MasterId = ID;
        MasterId = ID;
    }

    public void GetDefendantById(int ID)
    {
        using(DataController context = new DataController())
        {
            DefendantModel defendant = context.GetDefendantById(ID);
            grdDefendantDetails.DataContext = defendant;
        }
    }

    private void AddWitness(object sender, RoutedEventArgs e)
    {
        //If this is your button click event handler, sender is the Button
        //not an int.
        //int defId = (int)sender;
        
        DefendantModel st = new DefendantModel();
        int defId = Convert.ToInt32(st.ID);
        this.NavigationService.Navigate(new AddWitnessView(defId));
    }
}

Вы еще не отправили сообщение DefendantModel класс, но я подозреваю AddWitness это не то, что вы думаете. Вы создаете новый DefendentModel объект и получение любого идентификатора по умолчанию для этого класса. Может быть, вы искали int defId = Convert.ToInt32(MasterId); Трудно сказать, не имея полной картины того, что происходит :)


Branden Coker

Джон, спасибо за ответ. Я забыл упомянуть, что идентификатор приходит из другого представления, когда кто-то выбирает ответчика из списка. Эта часть работает, если я выбираю первого человека в списке, я получаю правильный идентификатор, как и любой другой человек. И моя модель-защитник, и модель-свидетель находятся ниже. Извини, что забыл их отправить. У меня есть логика доступа к данным (Linq) в отдельной папке.

Модель Подсудимого :

   public class DefendantModel
    {
        public int ID { get; set; }
        public string FirstName { get; set; }
        public string MiddleName { get; set; }
        public string LastName { get; set; }
        public string NameSuffix { get; set; }
        public string Alias { get; set; }
        public string SSN { get; set; }
        public string Race { get; set; }
        public string Sex { get; set; }
        public List<WitnessModel> WitnessModelList { get; set; }
        public WitnessModel WitnessModel { get; set; }
    }


Свидетель-Модель:
 public class WitnessModel
    {
        public int ID { get; set; }
        public int MasterID { get; set; }
        public string FirstName { get; set; }
        public string MiddleName { get; set; }
        public string LastName { get; set; }
        public string NameSuffix { get; set; }
        public string Sex { get; set; }
        public string Race { get; set; }
    }


Дайте мне знать, если я что-то упустил. Спасибо.

Jon McKee

Ладно, думаю, я знаю, что здесь происходит. Таким образом, это одна страница в более крупном приложении. Когда эта страница создается, вы передаете идентификатор вашего ответчика, который является как первичным ключом для вашего ответчика, так и внешним ключом для ваших свидетелей, извлекаете данные ответчика и обновляете их. DataContext для одного из элементов управления страницей, отображающих эти данные. Пока все хорошо.

Итак, теперь у вас есть страница для подсудимого, и вы хотите, чтобы они могли добавлять свидетелей. Таким образом, где-то на странице есть кнопка "Добавить свидетеля", которая обрабатывается AddWitness() Этот обработчик событий отвечает за настройку представления свидетеля и передачу идентификатора для этого ответчика, чтобы ID можно было использовать в качестве MasterID (внешнего ключа) при создании новых свидетелей? Правильно?

Если это так, то все, что вам нужно сделать, это передать идентификатор конструктора обработчику. Мой пример выше действительно сделал это:

//Add a property to your page
public int MasterID { get; private set; }

public DefendantView(int ID)
{
    InitializeComponent();
    GetDefendantById(ID);
    //Set that property in your constructor
    MasterID = ID;
}

private void AddWitness(object sender, RoutedEventArgs e)
{  
    //Pass the property to your witness view
    this.NavigationService.Navigate(new AddWitnessView(MasterID));
}

Branden Coker

Джон,
Я думаю, что смогу понять это отсюда. Спасибо вам за вашу помощь. Кнопка, к которой я пытаюсь получить идентификатор, на самом деле является кнопкой сохранения в представлении AddNewWitness. Представление имеет идентификатор от ответчика, это вопрос преобразования данных из полей в модель и сохранения его там, где моя проблема. Вот что я сейчас делаю..

 private void btnSaveWitness_Click(object sender, RoutedEventArgs e)
        {
            using (DataController context = new DataController())
            {
                DefendantViewModel defendant = new DefendantViewModel();

                defendant.DefendantModel.FirstName = txtFName.Text;
                defendant.DefendantModel.MiddleName = txtMName.Text;
                defendant.DefendantModel.LastName = txtLName.Text;
                defendant.DefendantModel.NameSuffix = txtSuffix.Text;
                defendant.DefendantModel.Race = cboRace.SelectedValue.ToString();
                defendant.DefendantModel.Sex = cboSex.SelectedValue.ToString();

                context.CreateWitness(defendant);
            }