Привязка данных C # не обновляет WPF - PullRequest
4 голосов
/ 10 декабря 2008

Я пытаюсь выполнить привязку данных в коде C #, а не в XAML. Привязка XAML, созданная в Expression Blend 2 к моему объекту 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 голосов
/ 10 декабря 2008

Ваша версия 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 голос
/ 03 января 2009

В исходном коде вы перепутали источник и путь.

     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 голосов
/ 10 декабря 2008

Запишите это внутри события Loaded вместо Constructor. Надеюсь, вы внедрили INotifyPropertyChanged, сработавший в установщике свойств DisplayName?

...