C# 用户控件如何在主窗口中访问文本框的值?
UserControls放在MainWindow中,但它们不相互实例化-它们没有所有者-成员关系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中绑定什么 创建一个接口:
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;