INotifyPropertyChanged值不更新值

时间:2013-06-21 09:46:02

标签: c# .net wpf .net-4.0 inotifypropertychanged

我现在已经摸不着头脑了。虽然我是.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请帮忙。

感谢。

3 个答案:

答案 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;