为什么我的绑定不起作用?

时间:2011-09-22 08:52:08

标签: wpf silverlight

这是Silverlight代码 - 但我想这在WPF中会是相同的 - 我有这个简单的课程

public Class A1
{
      string str1;

      public string Str_1
      {
           return str1;
      }
 }

 public Class B1
 {
      A1 a1;

      public A1 A_1
      {
           return a1;
      }
  }

我假设B1 :: A1.str1的值为“my string”。

现在在XAML中我有这个

<Grid x:Name="LayoutRoot" DataContext="B1">
   <StackPanel> 
      <TextBox Text="{Binding ElementName=A1, Path=Str_1, Mode=TwoWay}"/>
   </StackPanel>
</Grid>

在代码(xaml.cs)中,我在构造函数中写了这个

  LayoutRoot.DataContext = this;    

(B1对象是xaml.cs文件的一部分,B1也不为空,A1不为空)

但是==&gt;这不起作用...文本框的文本不会使用A1对象中的文本进行更新。

3 个答案:

答案 0 :(得分:2)

您正在使用元素绑定,但A1不是Xaml页面中的命名元素。

您想要Text={Binding Path=A_1.Str_1}

这意味着它指向数据上下文的A_1属性的Str_1属性(类后面的代码)。

请注意,TwoWay在这里毫无意义,因为您的房产没有设置。

要正确执行此操作(假设您的值将更改并且是必需的),您需要在A_1和Str_1属性上实现setter,并在A1和A1类上实现INotifyPropertyChanged。 B1。

答案 1 :(得分:2)

你可以说Text={Binding Path=A_1.Str_1, Mode=TwoWay}我认为这应该有效。

此外,如果你想进行双向绑定,你需要实现INotifyPropertyChanged让WPF知道它必须在更新代码中的值后刷新UI。

GJ

答案 2 :(得分:1)

首先,您的B1类必须实现INotifyPropertyChanged like this

然后你应该在你的B1类中创建一个属性代理:

public string Str_1
{
    get
    {
        return a1.str1;
    }

    set
    {
        a1.str1 = value;
        this.RaisePropertyChanged("Str_1"); // INotifyPropertyChanged implementation method
    }
}

最后更新你的绑定:

<TextBox Text="{Binding Path=Str_1}"/>