我正在尝试在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中任何见解为什么这只适用于启动?
答案 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?