Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# INotifyPropertyChanged值未更新值_C#_.net_Wpf_.net 4.0_Inotifypropertychanged - Fatal编程技术网

C# INotifyPropertyChanged值未更新值

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

我已经搔头两天了。虽然我是.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 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;