-5

我已经挠头2天了。虽然我是 .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.
}

我相信每次我更改 textsource 属性时,它都会反映文本框中的更改,但它不会发生。索内恩请帮忙。

谢谢。

4

3 回答 3

4
if (value != a)
{
    a = value;
    NotifyPropertyChanged("textsource");
}

您将 textsource 作为变量传递,而 NotifyPropertyChanged 正在提高 textsource 的实际值。相反,您应该传递它的名称“textsource”。

于 2013-06-21T09:51:27.560 回答
2

您正在编辑与绑定对象完全不同的对象。

只要您在主窗口类中,您就可以

((textbind)testgrid.DataContext).textsource = "two";

如果您不在主窗口类中,则需要确保将放入 datacontext 的 textbind 实例传递给正在执行更新的任何方法。

此外,您需要将 textsource 的实现更改为

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;
于 2013-06-21T10:04:07.867 回答
2

您的视图绑定到一个textbind对象实例(在您的情况下为tb)。如果您要更改该对象,它将反映在视图中:

tb.textsource = "new value";

但是您正在做的是创建一个未绑定到视图的新textbind对象 ( tb1),期望它在视图更改时修改视图,但这不是事情的工作方式。要让它工作,你必须设置tb1为你的新的DataContext;但是,您真正应该做的只是更改textbind最初绑定对象的属性。

此外,正如@Nightwish91 所提到的,您的NotifyPropertyChanged通话应如下所示

NotifyPropertyChanged("textsource");

否则,视图将收到不正确的属性更改通知,并且不会按预期更新。

于 2013-06-21T09:54:19.190 回答