4

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

这是有效的 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);

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

任何见解为什么这只适用于启动?

4

3 回答 3

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);
于 2008-12-10T18:58:55.723 回答
1

在原始代码中,您混淆了源代码和路径。

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

(我假设 PhoneService 是一个对象实例,否则可能 PhoneService.MyAccountService.Accounts[0] 应该是 Source?)

从内存中,您可以将路径作为参数传递给构造函数。

于 2009-01-03T06:44:35.977 回答
0

将其写入 Loaded 事件而不是构造函数中。希望您实现了在 DisplayName 属性设置器上触发的 INotifyPropertyChanged?

于 2008-12-10T18:20:39.623 回答