C#数据绑定不会更新WPF

时间:2008-12-10 18:13:34

标签: c# .net data-binding xaml code-behind

我正在尝试在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中

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

3 个答案:

答案 0 :(得分: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);

答案 1 :(得分: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);

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

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

答案 2 :(得分:0)

将此内容写入Loaded事件而不是Constructor。 希望您在DisplayName属性setter上触发INotifyPropertyChanged?