Привязка данных C # не обновляет WPF

Я пытаюсь сделать привязку данных в коде C # позади, а не XAML. Привязка XAML, созданная в Expression Blend 2 к моему объекту CLR, работает нормально. Моя реализация на C # обновляется только при запуске приложения, после чего последующие изменения в CLR не обновляют содержимое моей метки.

Вот рабочая привязка XAML. Сначала создается ObjectDataProvider в моем Window.Resources.

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

Любое понимание, почему это работает только при запуске?

10.12.2008 18:13:33
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);
3
10.12.2008 18:58:55
Я бы заменил displayNameBinding.Source на вызов this.TryFindResource ("PhoneServiceDS"), чтобы он в точности соответствовал его XAML, но в противном случае я собирался опубликовать решение, подобное этому.
Robert Macnee 10.12.2008 19:05:04
TryFindResource работал с объявлением ObjectDataSource в XAML. Я обнаружил, что ODS - это как создание экземпляра любого объекта, который я хочу использовать, поэтому настройка источника привязки на PhoneService, который я уже создал, также работает. Спасибо!
Jippers 10.12.2008 19:59:55

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

0
10.12.2008 18:20:39

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

     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] должен быть источником?)

Из памяти вы можете передать путь в качестве аргумента конструктору.

1
3.01.2009 06:44:35