Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用户控件如何在主窗口中访问文本框的值?_C#_Wpf_Mvvm_User Controls - Fatal编程技术网

C# 用户控件如何在主窗口中访问文本框的值?

C# 用户控件如何在主窗口中访问文本框的值?,c#,wpf,mvvm,user-controls,C#,Wpf,Mvvm,User Controls,UserControls放在MainWindow中,但它们不相互实例化-它们没有所有者-成员关系 我需要UserControls的后端代码才能从MainWindow的文本框中获取值。我被告知要使用数据绑定,但我真的不知道在UserControls中绑定什么 创建一个接口: interface Interface_ProSimIP { string ProSimIP_Text { get; set; } } 在主窗口ViewModel中: string Interface_Pro

UserControls放在MainWindow中,但它们不相互实例化-它们没有所有者-成员关系


我需要UserControls的后端代码才能从MainWindow的文本框中获取值。我被告知要使用数据绑定,但我真的不知道在UserControls中绑定什么

创建一个接口:

interface Interface_ProSimIP
{
    string ProSimIP_Text { get; set; }
}
在主窗口ViewModel中:

    string Interface_ProSimIP.ProSimIP_Text
    {
        get
        {
            return ProSimIP.Text;
        }
        set
        {  
        }
    }
在主窗口视图中:

我不知道这样做是否正确,也不知道如何在UserControls代码背后实现接口。

您可以对父窗口和用户控件使用相同的DataContext视图模型。将窗口的DataContext属性设置为视图模型类的实例,在该实例中实现逻辑,然后从窗口的XAML视图和用户控件绑定到视图模型的属性。然后窗口和控件有效地共享相同的后端代码

这种模式称为MVVM,是开发基于XAML的UI应用程序时推荐使用的模式。你应该学习它。以下MSDN页面可能为您提供了一个良好的起点:

如果您对MVVM模式一无所知或不遵循MVVM模式,那么采用另一种更糟糕但可能更快的方法是使用window.GetWindow方法从UserControl获取对窗口的引用,然后直接访问窗口中定义的任何控件:

var window = Window.GetWindow(this) as MainWindow:
if (window != null)
    string text = window.ProSimIP.Text;

您应该注意到,在开发松散耦合、可维护和可测试的应用程序时,这种代码并不遵循最佳实践。

不确定我是否正确理解您的意思。但是,如果您希望用户在textbox中键入的数据在代码隐藏或VM中作为字符串变量可用,您可以像这样绑定它:我需要UserControls的后端代码,以便能够从MainWindow的textbox中获取值。在WPF环境中,这是一种错误的方法。如果您的UserControl需要任何数据,请为该数据声明DependencyProperty并从主视图绑定DP当您说UserControl ViewModels时,听起来好像您认为每个UserControl都应该有自己的视图模型。虽然WPF专家经常建议这样做,但这绝对是错误的。UserControl永远不应该有自己的视图模型。相反,它应该公开通常可以绑定(但不一定)的依赖属性来查看模型属性。将窗口中的TextBox和UserControl绑定到相同的DataContext。非常感谢。Prateek Shrivastava我希望窗口中的值可用于UserControl。好的,我试试看@克莱门斯的UserControl视图模型我指的是UserControl.xaml.cs。我是不是叫错名字了,或者它们不应该包含除数据绑定以外的任何代码?谢谢。虽然这不是最佳实践,但改变我以前的设计似乎也不现实。我明天试试。
var window = Window.GetWindow(this) as MainWindow:
if (window != null)
    string text = window.ProSimIP.Text;