Установка свойств из другого класса - PullRequest
0 голосов
/ 12 июня 2018

Я хочу точно сказать, что я совершенно новичок в C #, и я просто тестирую, чтобы понять этот язык.

Хочется, чтобы я хотел добиться консольной печати во вторичном окне пары значений, которые я установил в MainWindow.

Это функция, содержащаяся в классе MainWindow, которая вызывается нажатием кнопки.

private void ValidationExecuted(object sender, ExecutedRoutedEventArgs eventArgs)
    {
        // If the validation was successful, let's open a new window.
        GeneratorWindow generatorWindow = new GeneratorWindow();
        generatorWindow.TextBlockName1.Text = this.tbPoints.Text;
        generatorWindow.TextBlockName2.Text = this.tbPDC.Text;

        int.TryParse(this.tbPoints.Text, out int numberOfPoints);
        int.TryParse(this.tbPDC.Text, out int pdc);

        // Those lines correctly print the values I've inserted in the TextBoxes.
        Console.WriteLine(numberOfPoints);
        Console.WriteLine(pdc);

        generatorWindow.NumberOfPoints = numberOfPoints;
        generatorWindow.MainPDC = pdc;
        generatorWindow.Show();

        // Resetting the UI.
        this.validator = new Validator();
        this.grid.DataContext = this.validator;
        eventArgs.Handled = true;
    }

Теперь мое дополнительное окно:

public partial class GeneratorWindow : Window
{
    /// <inheritdoc />
    /// <summary>
    /// Initializes a new instance of the <see cref="T:ABB_Rapid_Generator.GeneratorWindow" /> class.
    /// </summary>
    public GeneratorWindow()
    {
        this.InitializeComponent();
        // Those lines just print a pair of 0.
        Console.WriteLine(this.NumberOfPoints);
        Console.WriteLine(this.MainPDC);
    }

    /// <summary>
    /// Gets or sets the number of points.
    /// </summary>
    public int NumberOfPoints { private get; set; }

    /// <summary>
    /// Gets or sets the main PDC.
    /// </summary>
    public int MainPDC { private get; set; }
}

Как вы можете видеть вкомментарии к коду, Console.WriteLine(), содержащиеся в основном классе, работают правильно.Кроме того, я могу назначить свои пользовательские значения для TextBlocks, содержащиеся в другом классе.Напротив, строки Console.WriteLine() во вторичном классе просто выводят пару нулей.

Чего мне не хватало?

Ответы [ 3 ]

0 голосов
/ 12 июня 2018

вы можете добавить конструктор параметра-ize, чтобы сделать это

public partial class GeneratorWindow : Window
{
    //Private members
    int m_numberOfPoints;
    int m_mainPDC;

    /// <inheritdoc />
    /// <summary>
    /// Initializes a new instance of the <see cref="T:ABB_Rapid_Generator.GeneratorWindow" /> class.
    /// </summary>
    public GeneratorWindow(int mainPDC,int numberOfPoints)
    {
        this.InitializeComponent();
        this.m_mainPDC = mainPDC;
        this.m_numberOfPoints = numberOfPoints;
    }

    /// <summary>
    /// Gets or sets the number of points.
    /// </summary>
    public int NumberOfPoints 
    { 
      get{ return m_numberOfPoints; }
      set{ m_numberOfPoints = values; }
    }
    /// <summary>
    /// Gets or sets the main PDC.
    /// </summary>
    public int MainPDC
    { 
      get{ return m_mainPDC; }
      set{ m_mainPDC= values; }
    }

    public void Print()
    {
        Console.WriteLine(this.NumberOfPoints);
        Console.WriteLine(this.MainPDC);
    }
}

также это конструктор, поэтому он будет вызываться только при

GeneratorWindow generatorWindow = new GeneratorWindow();//here

Изменить вызов вторичного окна на

 generatorWindow  = new GeneratorWindow(pdc,numberOfPoints);
 generatorWindow.Print();

Кроме того, ваш код не выполнен в хорошем смысле IMO, зачем устанавливать такие значения?

   generatorWindow.TextBlockName1.Text = this.tbPoints.Text;
   generatorWindow.TextBlockName2.Text = this.tbPDC.Text;

Если у вас закрытые переменные установлены так же, как в примере вышеВы можете выполнять все преобразования, печать и, получая вывод консоли, в одном и том же классе. Вам нужно просто вызвать конструктор и метод печати. ​​

0 голосов
/ 12 июня 2018

Ответ выше верен, но есть альтернатива.Вы можете использовать методы установки, такие как setNumberOfPoints, setMainPDC и print co console после установки значения.Таким образом, в ValidationExecuted вы вызываете функцию для установки переменной, и в этой функции после установки переменной вы выводите ее на консоль.Но не забудьте удалить печать на консоль с constructor

0 голосов
/ 12 июня 2018

Проблема в том, что в GeneratorWindow вы пишете на консоль в методе constructor , поэтому значения выводятся перед их изменением .

Единственный способ действительно заставить этот вывод работать - это передать значения в качестве параметров конструктора и установить их (в конструкторе) перед выполнением вывода на консоль.Хотя нет логической причины идти по этому пути.

Например:

public GeneratorWindow(int numberOfPoints, int mainPdc)
{
    this.InitializeComponent();

    this.NumberOfPoints = numberOfPoints;
    this.MainPDC = mainPdc;

    Console.WriteLine(this.NumberOfPoints);
    Console.WriteLine(this.MainPDC);
}

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

Например, добавьте эту функцию к GeneratorWindow:

public void OutputValues()
{
    Console.WriteLine(this.NumberOfPoints);
    Console.WriteLine(this.MainPDC);
}

Который вы можете затем вызвать после того, как вы установили значения в другом классе:

GeneratorWindow generatorWindow = new GeneratorWindow();

generatorWindow.NumberOfPoints = numberOfPoints;
generatorWindow.MainPDC = pdc;

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