簡體   English   中英

C#數據綁定不會更新WPF

[英]C# data binding doesn't update WPF

我正在嘗試在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中;

任何見解為什么這只適用於啟動?

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

在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?)

從內存中,您可以將路徑作為參數傳遞給構造函數。

將此內容寫入Loaded事件而不是Constructor。 希望您在DisplayName屬性setter上觸發INotifyPropertyChanged?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM