C#/ WPF - 从父窗口获取子用户控件中的对象

时间:2017-07-27 20:05:51

标签: c# .net wpf xaml

对WPF和C#不太熟悉,所以如果这是明显错误的,请纠正我。在VSExpress2015 .NET Framework 4.5中工作。我在下面大大简化了我的代码,所以知道名称空间/库引用就在那里。

说我有一个带有Button和ContentControl的窗口:

<Window x:Class="Project.MainWindow">
    <Grid>
        <Button Name="Submit_Btn" Click="Submit_Btn_Click">
        <ContentControl Name="MainContentControl">
    </Grid>
</Window>

我的XAML项目中还有几个用户控制文件,如下所示:

<UserControl x:Class="Project.UserControl1">
    <Grid>
        <TextBox Name="TxtBox1">
    </Grid>
</Usercontrol>

我在MainWindow的后端有代码,可以将相应的UserControl动态加载到&#34; MainContentControl&#34;宾语。但是,我想从MainWindow的Submit_Btn_Click函数引用当前加载的UserControl中的对象 inside 。例如,在MainWindow.cs中,执行以下操作:

private void Submit_Btn_Click(object sender, RoutedEventArgs e)
{
    if(MainContentControl is currently loaded with UserControl1)
        Do_Something_Function(MainContentControl.TxtBox1.Text);
}

这里的主要问题是我不知道如何从父MainWindow的范围内调用TextBox1元素。我也不确定如何验证if条件(确认控件当前已加载)。有没有人知道如何以不同方式思考这个问题,甚至直接引用该对象(尽管这可能不是一个好主意)?

-

我根本没有使用/熟悉MVVM,而且我并不特别关心最佳性能,因为这是一个一次性的临时项目,很快就会死亡并重新开始-worked。我已经阅读了如何从孩子的父窗口访问数据的方法,但我没有找到真正与之匹配的方案。

再一次,我仍然熟悉C#,WPF和一般编码实践(已经过了几年),所以如果在这里使用ContentControl或UserControl不是最佳,(或混合两者没有意义),将非常感谢信息;然而,在这种情况下,我更关心的是让我的工作能够在以后学习更多适当的技术之前。

3 个答案:

答案 0 :(得分:1)

您可以在UserControl本身上公开属性和方法,以与内部的内容进行交互,而不是尝试访问UserControl中的TextBox。在您的情况下,您可以添加一个返回TextBox.Text当前值的属性。您还可以添加依赖项属性以方便绑定。

答案 1 :(得分:0)

看起来确实应该改进设计,但只是为了让这个工作,您可以执行以下操作:

    private void Submit_Btn_Click(object sender, RoutedEventArgs e)
    {
        var controlAsUserControl1 = MainContentControl.Content as UserControl1;
        if (controlAsUserControl1 != null)
        {
            Debug.WriteLine(controlAsUserControl1.TxtBox1.Text);
        }
    }

答案 2 :(得分:0)

您可以使用LogicalTreeHelper按名称进行搜索。

因此,您的示例可以访问TextBox1

 var txtBox = LogicalTreeHelper.FindLogicalNode(MainContentControl, "TextBox1") as TextBox;
 Do_Something_Function(txtBox?.Text);