2008-12-10 110 views
4

我想在后面的C#代码而不是XAML做数据绑定。在Expression Blend 2中创建的XAML绑定到我的CLR对象工作正常。我的C#实现仅在应用程序启动后更新,此后CLR的更改不会更新我的标签内容。C#数据绑定不更新WPF

这是工作的XAML绑定。 首先在我的Window.Resources中创建一个ObjectDataProvider。

<ObjectDataProvider x:Key="PhoneServiceDS" 
    ObjectType="{x:Type kudu:PhoneService}" d:IsDataSource="True"/> 

和标签内容绑定:

<Label x:Name="DisplayName" Content="{Binding 
    Path=MyAccountService.Accounts[0].DisplayName, Mode=OneWay, 
    Source={StaticResource PhoneServiceDS}}"/> 

的伟大工程。但我们希望在C#中进行设置,以便我们可以独立更改XAML(即新皮肤)。我的一次C#工作如下:

 Binding displayNameBinding = new Binding(); 
    displayNameBinding.Source = 
     PhoneService.MyAccountService.Accounts[0].DisplayName; 
    displayNameBinding.Mode = BindingMode.OneWay; 
    this.DisplayName.SetBinding(Label.ContentProperty, displayNameBinding); 

这是在我的MainWindow之后InitializeComponent();

任何洞察为什么这只适用于启动?

回答

3

您的C#版本与XAML版本不匹配。应该可以编写标记的代码版本,尽管我不熟悉ObjectDataProvider。

尝试这样:

Binding displayNameBinding = new Binding("MyAccountService.Accounts[0].DisplayName"); 
displayNameBinding.Source = new ObjectDataProvider { ObjectType = typeof(PhoneService), IsDataSource = true }; 
displayNameBinding.Mode = BindingMode.OneWay; 
this.DisplayName.SetBinding(Label.ContentProperty, displayNameBinding); 
+0

我会用对this.TryFindResource(“PhoneServiceDS”)的调用来替换displayNameBinding.Source,所以它完全等同于他的XAML,但是否则我正准备像这样发布解决方案。 – 2008-12-10 19:05:04

0

在Loaded事件而不是Constructor中写入此内容。 希望你在DisplayName属性设置器中触发了INotifyPropertyChanged?

1

在priginal代码你混淆了源和路径。

 Binding displayNameBinding = new Binding(); 
    displayNameBinding.Source = PhoneService; 
    displayNameBinding.Path = "MyAccountService.Accounts[0].DisplayName"; 
    displayNameBinding.Mode = BindingMode.OneWay; 
    this.DisplayName.SetBinding(Label.ContentProperty, displayNameBinding); 

(I假设PhoneService是一个对象实例,否则或许PhoneService。MyAccountService.Accounts [0]应该是源?)

从存储器,可以传递路径作为参数给构造。