我现在已经摸不着头脑了。虽然我是.NET新手,但我已阅读了20多篇帖子和问题,我认为我的代码应该可行。请注意一些。
XAML:
<TextBox Grid.Column="3" Name="testgrid" Text="{Binding textsource, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}"></TextBox>
代码背后:
public MainWindow()
{
InitializeComponent();
textbind tb = new textbind();
tb.textsource = "one"; //one is displayed in the textbox.
testgrid.DataContext = tb;
}
和
public class textbind : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(String info)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}
private string a=string.Empty;
public textbind()
{
}
public string textsource
{
get { return a; }
set
{
if (value != a)
{
a = value;
NotifyPropertyChanged(textsource);
}
}
}
}
改变财产:
public class changevalue
{
//code doing things. this class is initialized by some other processes.
textbind tb1 = new textbind();
tb1.textsource = "two"; // no updates to two in the text box.
}
我相信每次更改文本源属性时,它都会反映文本框中的更改,但它不会发生。 Soneone请帮忙。
感谢。
答案 0 :(得分:4)
if (value != a)
{
a = value;
NotifyPropertyChanged("textsource");
}
您将textource作为变量传递,而NotifyPropertyChanged正在提高textource的实际值。相反,你应该传递它的名字,“textsource”。
答案 1 :(得分:2)
您的视图绑定到textbind
对象的单个实例(在您的情况下为tb
)。如果您要更改该对象,它将反映在视图中:
tb.textsource = "new value";
但是你正在做的是创建一个新的textbind
对象(tb1
),它没有绑定到视图,期望它在视图发生变化时修改它,这不是事情的工作方式。要使其正常工作,您必须将tb1
设置为新的DataContext
;但是,您应该真正做的只是更改最初绑定对象的textbind
属性。
此外,正如@ Nightwish91所述,您的NotifyPropertyChanged
电话应该如下所示
NotifyPropertyChanged("textsource");
否则,视图将获得不正确的属性更改通知,并且不会按预期更新。
答案 2 :(得分:2)
您正在编辑与绑定对象完全不同的对象。
只要你在主窗口课程中就可以做到
((textbind)testgrid.DataContext).textsource = "two";
如果您不在主窗口类中,则需要确保将放入datacontext的textbind实例传递给执行更新的任何方法。
此外,您需要将textource的实现更改为
public string textsource
{
get { return a; }
set
{
if (value != a)
{
a = value;
NotifyPropertyChanged("textsource");
}
}
}
更改后的属性的名称需要传递给notifypropertychanged而不是它的值。
更新以响应Naresh的新评论。
您需要跟踪实例并在代码中传递它,例如在您的更改值类中执行类似
的操作public class changevalue {
public void doChange(textbind source) {
source.textsource = "two"; // no updates to two in the text box.
}
}
然后,您需要将textbind实例传递给doChange函数,即从mainform调用时。
或者你可以做到
public class changevalue {
public textbind source {get; private set;}
public changevalue() {
this.source = new textbind();
}
public void doChange() {
source.textsource = "two"; // no updates to two in the text box.
}
}
然后,在初始化changevalue类的地方,您需要引用表单。然后就可以了
var myChangeValue = new changevalue();
mymainform.DataContext = myChangeValue.source;