将TextBox绑定到WPF

时间:2017-01-24 12:09:09

标签: c# wpf binding

我知道你会说这个问题是重复的,但我还没有找到任何可行的解决方案。 这是一个简单的场景:

我有一个文本框和一个按钮:

<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,但它也没有工作。

3 个答案:

答案 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对话框显示文本。 谢谢希望对您有所帮助。干杯