2011-09-22 36 views
0

这是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具有值“我的字符串”。

现在,在XAML我有这样

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

在代码(xaml.cs)i。在这种构造

LayoutRoot.DataContext = this;  

(B1所述对象是XAML的一部分写入。 cs文件并且B1也不为空,而A1也不为空)

但是==>这不起作用...并且文本框的文本不是用A1对象中的文本更新的。

+1

仍不能确定你想要什么exacty做,你可以展示我们你的xaml呢?认为你需要查看绑定的路径 – gjvdkamp

+0

在调试 - 我看到有A1对象的B1对象和A1的str1用正确的字符串。 – Yanshof

回答

2

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

你想Text={Binding Path=A_1.Str_1}

这意味着,它指向的数据上下文(隐藏类代码)的A_1属性的Str_1财产。

请注意,由于您的房屋没有安装人员,因此TwoWay没有意义。

要做到这一点正确(假设你的价值观会改变,需要),你需要实现你的A_1和Str_1性质制定者,对双方的A1级执行INotifyPropertyChanged & B1。

+0

你能解释一下吗? - 我想要绑定到str1 - 并且我在xaml.cs中的对象是B1的对象实例。 – Yanshof

+1

我正在为你写下这样的例子:) –

+0

谢谢!这项工作!在什么情况下我需要添加“ElementName”? – Yanshof

2

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

此外,如果您要执行双向绑定,则需要实施INotifyPropertyChanged以让WPF知道在更新代码中的值后它必须刷新UI。

GJ

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}"/>