我在mainpage.xaml
中编写了这些代码<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
<StackPanel>
<TextBox x:Name="xxx" Text="{Binding Test}" TextChanged="xxx_TextChanged" />
<Button x:Name="click" Click="click_Click" Content="click" />
</StackPanel>
</Grid>
这些在mainpage.xaml.cs
中 private string test;
public string Test
{
get { return test; }
set
{
if (test != value)
{
test = value;
OnPropertyChanged("Test");
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged(string PropertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(PropertyName));
}
}
// Constructor
public MainPage()
{
InitializeComponent();
}
private void xxx_TextChanged(object sender, TextChangedEventArgs e)
{
Debug.WriteLine(Test);
Debug.WriteLine(test);
}
但是测试没有绑定到文本框,当我将smth写入文本框时测试没有改变。 我做错了什么以及如何纠正?
答案 0 :(得分:1)
尝试将BindingMode
设置为TwoWay:
Text="{Binding Test, Mode=TwoWay}"
我注意到的另一件事是,你的工作绑定需要设置DataContext
,但你不能在你的例子中这样做。一种方法是这样的:
public MainPage()
{
InitializeComponent();
ContentPanel.DataContext = this;
}
如果首选Xaml,您可以使用RelativeSource
属性绑定到Xaml中的页面,而无需设置DataContext:
Text="{Binding RelativeSource={RelativeSource FindAncestor,
AncestorType={x:Type Window}}, //or Page
Path=Test, Mode=TwoWay}"
另一件事,Test
将不会在您在TextBox中键入的每个字符之后设置,而是在用户完成文本编辑后设置,例如将活动控件切换到下一个。