C#数据绑定无法更新WPF

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);

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

有什么想法,为什么它只在启动时起作用?

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);

我会将displayNameBinding.Source替换为调用this.TryFindResource("PhoneServiceDS"),这样它就与他的XAML完全等效,但除此之外,我准备发布一个与此类似的解决方案。 - Robert Macnee
TryFindResource 方法需要在 XAML 中声明 ObjectDataSource。我发现 ODS 就像是实例化我想要使用的任何对象,所以将我的绑定源设置为已经实例化的 PhoneService 也可以工作。谢谢! - Jippers

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]作为源?

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


0
请将此代码写在Loaded事件中,而不是构造函数中。 希望您已经实现了在DisplayName属性setter上触发INotifyPropertyChanged?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接