【问题标题】:How to pass data from child form event to parent form item?如何将数据从子表单事件传递到父表单项?
【发布时间】:2011-01-24 08:16:50
【问题描述】:

目前我有一个主窗体,我从中调用一个弹出窗口,该弹出窗口是我在一个单独的 XAML 文件中为我的拼写检查器创建的。它是这样称呼的:

SpellCheckerPopupControl popupControl = new SpellCheckerPopupControl();

popupControl.SpellChecklistBox.Items.Clear();

//some code to check the word and populate the child listbox with spelling suggestions

popupControl.SpellCheckerPopup.IsOpen = true;

我在列表框中的 SelectionChanged 上的子项中设置了一个事件,以便将数据传递回主窗体,目前我只想将选择传递回我的主窗体,以便我可以获取选定的单词和用它替换拼写错误的那个。不幸的是,我似乎无法将子表单事件中的数据传递回父表单。

SpellCheckerPopup 的 XAML 只是一个 <PopUp>,其中包含一个 <ListBox>

仅出于测试目的,我尝试仅获取所发生情况的输出并将字符串粘贴到主文本框中,如下所示:MainPage.txtArticle.Text = s;,但是虽然 MainPage 位可用,但它的任何元素都没有,并且因此,我无法从子事件中操纵它们。

【问题讨论】:

    标签: c# silverlight xaml web-applications silverlight-4.0


    【解决方案1】:

    创建窗口的属性

    var window = new popupControl.Open();
    

    然后在 window.close 事件上检查Window.txtArticle.Text;

    这应该可行。如果没有,则将它们绑定到后面代码中的属性。

    [更新]

    例子:

    var window = new MyTestChildWindow();
    //This is just to show how to change properties in the testwindow.
    window.SomeProperty = true;
    window.Show();
    window.Closed += (s, ea) =>
    {
      if (window.DialogResult.ToBoolean())
      {
        // this is a property in the code behind.
        if (window.SelectedItem != null)
        {
          //Property = property on mainpage
          //window.SelectedItem = property in childwindow
          this.Property = window.SelectedItem;
        }
      }
    };
    

    此代码进入您的主页。

    希望这会有所帮助。

    【讨论】:

    • 好吧,看起来 PopUp 控件有一个 .Closed 事件,该事件会在 IsOpen 属性设置为 false 时触发。在我在列表框中选择某些内容后的子代码中,它获取所选内容的值并关闭弹出窗口;但是如何将选择的内容传递回我的 SpellCheckerPopup_Closed 事件处理程序?
    • 有没有办法在父页面中声明一个公共字符串,然后在子事件的代码中更改该变量?之后,当 Closed 事件触发时,我可以使用变量中的值并更新父页面上的内容。或者有更优雅的方法吗?
    • 如果您使用的是 MVVM,您可以将两个页面绑定到该视图模型并使用相同的属性(使用 OnPropertyChanged 事件)。这样您就不必在页面之间使用任何属性或值发送。如果您不想或不想,在子窗口中使用属性就像“window.”。不完全确定这适用于对象(文本框等)。作为对您在 cmoment 中的第一个问题的回答:在关闭的事件中:var item = window.yourdatagrid.SelectedItem;
    【解决方案2】:

    您还可以在 Program.cs 文件中创建一个属性,您可以将值传递给该属性。然后,您将可以访问该属性应用程序范围。只需使用:

    Program.SomeProperty
    

    【讨论】:

      【解决方案3】:

      使用在其他地方声明的变量是一个问题的根源,因为没有任何东西可以保证“外部”数据的真实性。

      如果您的事件是路由事件,您可以随时查询 OriginalSource 并从中获取信息。如果您的事件不是路由事件,您可以创建一个附加事件并将一个 OriginalSource 传递给您的弹出窗口。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-10-05
        • 2019-09-07
        • 1970-01-01
        • 2011-12-27
        • 1970-01-01
        • 1970-01-01
        • 2018-04-05
        相关资源
        最近更新 更多