Передача переменных из одного окна в другое уже объявлена - PullRequest
0 голосов
/ 08 мая 2020

Мне было интересно, можно ли отправлять переменные из одного окна в другое, главное из которых уже объявлено.

Например У меня "Window1" нажмите кнопку «Добавить» и от go до "Window2" я заполняю поля, и когда я нажимаю «Сохранить», он отправляет данные в сетку данных, которая находится в "Window1".

"Window1":

Window1

Код DataGrid1 Window1:

<DataGrid x:Name="Items" HorizontalAlignment="Left" Height="356" Margin="10,10,0,0" VerticalAlignment="Top" Width="772" >
            <DataGrid.Columns>
                <DataGridTextColumn Header="Text1" IsReadOnly="True" Binding="{Binding Path=Area01}" Width="130"></DataGridTextColumn>
                <DataGridTextColumn Header="Text2" IsReadOnly="True"  Binding="{Binding Path=Area02}" Width="50"></DataGridTextColumn>
                <DataGridTextColumn Header="Text3" IsReadOnly="True"  Binding="{Binding Path=Area03}" Width="50"></DataGridTextColumn>
                <DataGridTextColumn Header="Image" IsReadOnly="True"  Binding="{Binding Path=Area03}" Width="*"></DataGridTextColumn>
            </DataGrid.Columns>
            <DataGrid.ContextMenu>
                <ContextMenu>
                    <MenuItem Header="Add" Click="OnDelete" />
                    <MenuItem Header="Edit" Click="OnDelete" />
                    <MenuItem Header="Delete" Click="OnDelete" />
                </ContextMenu>
            </DataGrid.ContextMenu>
        </DataGrid>

Код кнопки «Добавить»: Я знаю, что это было очень очевидно, но нужно было убедиться, что

Window2 w = new Window2();
w.Show();

Нажмите " Добавьте кнопку "и go в" Window2 ":

enter image description here

Вы должны отправить изображение и 5 strings .

Я пробовал:

  • Go через файл, но на изображении это дает ошибку.
  • Прохождение через объекты, которые я пытался вызвать функция и прохождение, но уже было объявлено, что этого недостаточно.
  • И я использовал этот код, но проблема в том, что если у вас открыто более одного окна, это дает ошибку.

    ((Window1) Application.Current.MainWindow) .SendValues ​​( Image , " "," "," ");

Если бы вы могли мне помочь, я был бы очень счастлив.

Извините, я плохо говорю на английском sh. Спасибо.

Ответы [ 2 ]

1 голос
/ 09 мая 2020

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

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

    public void ThisMethodInFirstWindow(Image ImageFromThisForm, string firstText, string secondText)
    {
        // now in your first form, do whatever you need to with the now
        // available parameters coming from the second form.  You still should
        // validate nothing is NULL or empty or whatever rules you have...
    }

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

public partial class Window2 : Window
{
    public Window2()
    {
        InitializeComponent();
    }

    // declare an overloaded function to the window that accepts a function
    // but also calls its default constructor for InitializeComponent() in case
    // you have other preparation stuff going on in the window.
    public Window2(Action<Image, string, string> doWhatInOriginalWindow ) : this()
    {
        PassBackToMainWindow = doWhatInOriginalWindow;
    }

    public Action<Image, string, string> PassBackToMainWindow {get; set;}
}

Обратите внимание, что свойство PassBackToMainWindow имеет подпись , который ожидает 3 параметра изображения, строки и строки. Также обратите внимание, что перегруженный метод окна имеет одно и то же объявление Action, и все они соответствуют подписи, созданной в первом окне.

Теперь мы можем вызвать окно ... обе версии ...

// Here, you are passing the METHOD name you want to handle the data to be added
// this uses the overload method
Window2 w = new Window2(ThisMethodInFirstWindow);
w.ShowDialog();

или

// this version creates window.  Specifically applies the action to tell what method
// you explicitly want called from within the second form, THEN show the window last
Window2 w = new Window2();
w.PassBackToMainWindow = ThisMethodInFirstWindow;
w.ShowDialog();

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

private void Button_Click(object sender, RoutedEventArgs e)
{
    if (PassBackToMainWindow == null)
        return;

    PassBackToMainWindow(ImageFromThisForm, ThisWindow.Text1.Text, ThisWindow.Text2.Text);
}

Теперь, вместо огромного набора параметров, если у вас есть структурный класс с множеством свойств, например

public class MySampleThing
{
   public Image MyImageForWindow {get; set;}
   public string MyText1 {get; set;}
   public string MyText1 {get; set;}
}

Тогда вы можете просто изменить сигнатуру метода. и элементы действий на

public void SomeFunction( MySampleThing singleInboundParameter )
{
   // Now you can use EVERYTHING available on your object parameter
   var tmp = singleInboundParameter.MyImageForWindow;
   // etc.
}

И действия будут перечислены как

Action<MySampleThing>

И в качестве последнего вы можете просто передать обратно все Window2, например

public void SomeFunction( Window2 entire2ndWindow )

Action<Window2>
1 голос
/ 09 мая 2020

Все, что вам нужно сделать, это предоставить переменные, которые вы хотите вернуть, как свойства Window2.

Например, в Window2 вы можете иметь:

public string String1 { get; set; }
public string String2 { get; set; }
public string String3 { get; set; }

В Window2 вы должны привязать эти свойства к пользовательскому интерфейсу или установить их с помощью кода. Затем вы можете ссылаться на свойства следующим образом:

//Your existing code in the add button's click event
Window2 w = new Window2();
w.ShowDialog();

//Accessing the properties after the window is shown
this.SomeProperty = w.String1;
this.DoSomethingWithString(w.String2);

Обратите внимание, что я использовал ShowDialog, а не Show. ShowDialog приостанавливает вызов кода и продолжает после закрытия Window. В приведенном выше коде метод остановится на ShowDialog до закрытия w, а затем продолжится. См. Обзор диалоговых окон для получения дополнительной информации.

Если вы хотите, чтобы пользователь мог продолжать использовать вызов Window1, пока Window2 открыт, вы можете использовать Show, но тогда вам нужно будет объявить одно или несколько событий на Window2 и добавить обработчики из Window1, чтобы получать уведомления, когда переменная, которую вы хотите, была изменена.

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