我知道你会说这个问题是重复的,但我还没有找到任何可行的解决方案。 这是一个简单的场景:
我有一个文本框和一个按钮:
<TextBox x:Name="textbox" Text="{Binding st.SomeText}">
<Button Click="Button_Click">Push</Button>
我有一个名为Something的课程:
public class Something
{
public string SomeText { get; set; }
}
我在MainWindow类中有一个对象:
public partial class MainWindow : Window
{
Something st;
public MainWindow()
{
InitializeComponent();
st = new Something();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
MessageBox.Show(st.SomeText);
}
}
所以我想在文本框中键入内容,按下按钮并收到包含文本框文本的消息,但我不断收到空消息。 我应该修改什么?
很多解决方案&#39;说使用Stackpanel或其他东西并设置DataContext,但它也没有工作。
答案 0 :(得分:1)
首先必须将DataContext
属性设置为ViewModel的实例,在本例中为SomeThing
类,因此您需要在xaml
的CodeBehind中设置上下文形式如:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
Something st = new Something();
this.DataContext = st;
}
}
然后在您的视图中,即xaml文件,您可以设置控件的绑定,即为文本框绑定哪个特定属性:
<TextBox x:Name="textbox" Text="{Binding SomeText}">
如果你想在WPF应用程序中使用正确的MVVM模式,那么你应该使用Commands而不是使用按钮的Click事件。
您可能需要查看How to Implement MVVM in WPF
答案 1 :(得分:0)
您是如何设置数据上下文的?
数据上下文是WPF查找其绑定的地方。您似乎正在尝试绑定到代码隐藏,在这种情况下,您需要将DataContext设置为对象本身,并将字段st更改为属性。
private Something _st;
public Something st
{
get
{
return _st;
}
set
{
_st = value;
OnNotifyPropertyChanged("st");
}
}
public MainWindow()
{
InitializeComponent();
this.DataContext = this;
st = new Something();
}
但是,如果你总是想要绑定到st内的东西,那么直接将数据上下文设置为Something可能更有意义:
public MainWindow()
{
InitializeComponent();
st = new Something();
this.DataContext = st ;
}
并简单地绑定:
<TextBox Text="{Binding SomeText}">
这意味着您不需要实现INotifyPropertyChanged,或者在您的Window上将st作为公共属性(但您应该在Something上,在SomeText的setter中触发更改通知)。
答案 2 :(得分:0)
由于在这种情况下您使用的是按钮单击,所以我相信一种更简单的方法将使您可以将button_click方法本身的文本绑定到文本框中: cs文件: 公共局部类MainWindow:Window {
public MainWindow()
{
InitializeComponent();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
string myText;
myText = txtBox.Text;
MessageBox.Show(myText);
}
}
XAML:
<TextBox Name="txtBox">
所以这里发生的是我通过文本框的名称获取在文本框中键入的txt。在Button_Click方法Im中,将文本框中的文本绑定到字符串,并通过Message.Show对话框显示文本。 谢谢希望对您有所帮助。干杯