C# INotifyPropertyChanged值未更新值
我已经搔头两天了。虽然我是.NET新手,但我已经阅读了20多篇文章和问题,我认为我的代码应该可以工作。一些请投光 XAML: 以及: 更改属性:C# INotifyPropertyChanged值未更新值,c#,.net,wpf,.net-4.0,inotifypropertychanged,C#,.net,Wpf,.net 4.0,Inotifypropertychanged,我已经搔头两天了。虽然我是.NET新手,但我已经阅读了20多篇文章和问题,我认为我的代码应该可以工作。一些请投光 XAML: 以及: 更改属性: public class changevalue { //code doing things. this class is initialized by some other processes. textbind tb1 = new textbind(); tb1.textsource = "two"; // no upd
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.
}
我相信每次我更改textsource属性时,它都会反映textbox中的更改,但不会发生。索尼昂,请帮忙
谢谢
if (value != a)
{
a = value;
NotifyPropertyChanged("textsource");
}
您正在将textsource作为变量传递,NotifyPropertyChanged正在提升textsource的实际值。相反,您应该传递它的名称“textsource”。您的视图绑定到
textbind
对象的一个实例(在您的情况下,tb
)。如果要更改该对象,它将反映在视图中:
tb.textsource = "new value";
但是您所做的是创建一个新的textbind
对象(tb1
),该对象不绑定到视图,期望它在视图更改时修改视图,而这不是工作方式。要使其工作,您必须将tb1
设置为新的DataContext
;但是,您真正应该做的只是更改原始绑定对象的textbind
属性
另外,正如@Nightwish91所提到的,您的NotifyPropertyChanged
调用应该如下所示
NotifyPropertyChanged("textsource");
否则,视图将收到不正确的属性更改通知,并且不会按预期更新。您正在编辑与绑定对象完全不同的对象 只要你是在你的主窗口类你可以做
((textbind)testgrid.DataContext).textsource = "two";
var myChangeValue = new changevalue();
mymainform.DataContext = myChangeValue.source;
如果您不在mainwindow类中,则需要确保将放入datacontext的textbind实例传递给执行更新的任何方法
此外,您需要将textsource的实现更改为
public string textsource
{
get { return a; }
set
{
if (value != a)
{
a = value;
NotifyPropertyChanged("textsource");
}
}
}
更改属性的名称需要传递给notifypropertychanged,而不是它的值
更新以回应Naresh的新评论
您将需要跟踪实例并在代码中传递它,因此,例如,在您的change value类中,您可以执行以下操作
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类,都需要对表单进行引用。那你就可以了
((textbind)testgrid.DataContext).textsource = "two";
var myChangeValue = new changevalue();
mymainform.DataContext = myChangeValue.source;
我明白你说的。但是我该怎么做呢?每次都会改变背景吗?我对实现感到震惊。请参阅我更新的答案-您应该保留相同的DataContext,但修改原始的
textbind
实例。@Naresh从DataContext获取现有对象并对其进行更改:((textbind)testgrid.DataContext)。textsource=“new value”代码>。将这两个答案结合起来,使事情顺利进行。@Naresh:如果你认为这没有什么区别,你就不知道自己在做什么。这不会解决具体问题,但你应该将NotifyPropertyChanged改为var handler=PropertyChanged;if(handler!=null){handler(this,new PropertyChangedEventArgs(info));}
以帮助避免在测试和执行之间PropertyChanged可能变为null的线程问题。我愿意打赌,如果您查看输出窗口,您将在启动应用程序或更新值时看到绑定错误。这只是一种更好的表达HB所说的话的方式。是的。我现在知道这个错误了。您能提供更多关于将实例传递给另一个方法的信息吗?谢谢,我没看到你更新。虽然我终于得到了我想要的。正如你所说,通过了引用。非常感谢。我花了很多时间才弄明白。
var myChangeValue = new changevalue();
mymainform.DataContext = myChangeValue.source;