我似乎无法将控件的值绑定到对象。我想将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
答案 0 :(得分:2)
将str更改为自动属性:
public string str {get;组; }
将DataContext更改为:
DataContext = this;
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灯来进行绑定。