WPF控件绑定到单个变量

时间:2018-06-12 06:44:21

标签: c# wpf data-binding

我似乎无法将控件的值绑定到对象。我想将TextBox绑定到string对象,其想法是当文本框的文本发生更改时,它也应自动更改对象。无法弄清楚我做错了什么。这是我尝试过的:

MainWindow.xaml.cs:

public partial class MainWindow : Window
    {
        string str;
    public MainWindow()
    {
        InitializeComponent();
        this.DataContext = str;
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {

    }
}

和MainWindow.xaml:

<Window x:Class="WpfApp1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp1"
        mc:Ignorable="d"
        Title="MainWindow" Height="150" Width="150">
    <Grid Margin="0,0,642,319">
        <TextBox HorizontalAlignment="Left" Height="23"  TextWrapping="Wrap" Text="{Binding str}" VerticalAlignment="Top" Width="120" Margin="0,0,-120,-46" />
        <Button Content="Button" HorizontalAlignment="Left" VerticalAlignment="Top" Width="75" Click="Button_Click" Height="23" Margin="0,28,-75,-51" RenderTransformOrigin="0.423,2.257" />

    </Grid>
</Window>

因此,当我在文本框中输入内容并单击按钮时,我应该在调试时看到str中的文字,但始终是null

3 个答案:

答案 0 :(得分:2)

  1. 将str更改为自动属性:

    public string str {get;组; }

  2. 将DataContext更改为:

    DataContext = this;

  3. DataContext是用于保存绑定属性/命令/事件的类。 属性/命令/事件需要公开才能被您的视图访问。

    要使双向绑定起作用,您必须通知UI绑定该属性已更改,并且您需要为包含已绑定在UI中的属性的类实现INotifyPropertyChanged接口。您将需要一个私人财产,您不能通过自动财产通知。

    简单示例:

    public class Sample : INotifyPropertyChanged
    {
        private string _str;
        public string Str
        {
            get { return _str; }
            set
            {
                _str = value;
                NotifyPropertyChanged(nameof(Str));
            }
        }
    
        public event PropertyChangedEventHandler PropertyChanged;
    
        public void NotifyPropertyChanged(string propName)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propName));
        }
    }
    

答案 1 :(得分:0)

首先,WPF中的数据绑定仅适用于公共属性。因此,您必须在代码中明确声明一个(而不是string str;

public string str { get; set; }

其次,视图的DataContext属性定义了将在其中搜索绑定属性的对象/类。示例中的行this.DataContext = str;表示您希望在str对象(string}内查找视图中的绑定。你应该用

替换这一行
this.DataContext = this;

这样就可以在这个视图本身的代码中搜索绑定。

<强>备注 如果this.DataContext = str;是公共属性并且使用诸如

之类的表达式进行绑定,那么可能也会继续使用行str
<TextBox Text="{Binding .}" />

将绑定到DataContext属性的值。

答案 2 :(得分:0)

也许您可以使用MVVM灯来进行绑定。