我有2个“文本框”都绑定到源字符串属性“mode = 2way”。当我改变一个文本时,另一个完全改变。但是当我以编程方式更改源字符串时,都不会更新。我无法弄清楚我错过了什么。这是我的代码片段:
Xaml代码:
<StackPanel Orientation="Vertical">
<StackPanel.DataContext>
<local:x/>
</StackPanel.DataContext>
<TextBox Text="{Binding Text,Mode=TwoWay}" />
<TextBox Text="{Binding Text, Mode=TwoWay}"/>
</StackPanel>
<Button Content="Reset" Click="Button_Click"/>
按钮单击处理程序:
private void Button_Click(object sender, RoutedEventArgs e)
{
obj = new x() { Text="reset success"};
}
对象类:
class x:INotifyPropertyChanged
{
private string text;
public string Text
{
get { return text; }
set
{
text = value;
OnPropertyChange("Text");
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChange(string propertyName)
{
PropertyChangedEventHandler propertyChangedEvent = PropertyChanged;
if (propertyChangedEvent != null)
{
propertyChangedEvent(this, new PropertyChangedEventArgs(propertyName));
}
}
}
答案 0 :(得分:1)
<StackPanel x:Name="myStackPanel" Orientation="Vertical">
<StackPanel.DataContext>
<local:x/>
</StackPanel.DataContext>
<TextBox Text="{Binding Text, Mode=TwoWay}" />
<TextBox Text="{Binding Text, Mode=TwoWay}"/>
</StackPanel>
上面的XAML摘录意味着:将stackpanel的DataContext
设置为类x
的新实例。因为实例化是由XAML完成的,所以在从stackpanel的x
获取实例之前,您没有引用该DataContext
实例。
如果您想测试数据绑定是否有效,则应修改类x
的现有实例(当前设置为DataContext
)。
private void Button_Click(object sender, RoutedEventArgs e)
{
var currentDataContext = (x)myStackPanel.DataContext;
x.Text = "reset success";
}
如果您想按照评论中的说明从代码中设置StackPanel
的{{1}},则会保存以删除XAML中的DataContext
设置部分。
答案 1 :(得分:1)
你做了一个新对象。这就是原因。不要只生成一个新对象并更改实际绑定对象的内容(文本)。
创建新对象时,解决方案中的“subcription”将丢失。 :(