2012-02-21 2 views
0
<ItemsControl ItemsSource="{Binding ExportFormat, UpdateSourceTrigger=PropertyChanged}" Grid.Column="1"> 
       <ItemsControl.ItemsPanel> 
        <ItemsPanelTemplate> 
         <StackPanel Orientation="Horizontal"/> 
        </ItemsPanelTemplate> 
       </ItemsControl.ItemsPanel> 
       <ItemsControl.ItemTemplate> 
        <DataTemplate> 
         <Button Content="{Binding}" Margin="5" Height="50" Width="70" Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}, Path=DataContext.setExportFormat, UpdateSourceTrigger=PropertyChanged}" CommandParameter="{Binding}"></Button> 
        </DataTemplate> 
       </ItemsControl.ItemTemplate> 
      </ItemsControl> 

Итак, у меня есть этот код в моем xaml, и кнопка получает файл со списком строк. В зависимости от того, какие пользователи выбирают в предыдущем Usercontrol, этот элемент будет подаваться с разными элементами. Проблема заключается в том, что пользователь выбирает один вариант при первом запуске, кнопка будет заполнена правильно, но если пользователь вернется и выберет другую опцию, обновите обновление и покажет то же, что и раньше. Мой английский не самый лучший, но я думаю, я мог бы заставить меня понять! Есть идеи?! PS: привязка к кнопке относится к свойству readOnly, поэтому я не могу определить его в режиме = «TwoWay» .. я взглянул на отладку, а свойство ExportFormat получает обновления с новыми элементами, но usercontrol по-прежнему отображает первый вариант !!Проблемы с привязкой элементов управления WPF

С уважением Руи Нуньес

+0

Каков тип ExportFormat на ViewModel? –

+0

list (of string) – Rui

+0

Как указывает Бабуин - это ваша проблема - ObservableCollection уведомляет подписчиков (привязок), что-то изменилось - Список не делает. –

ответ

1

Вы не предоставили кода позади, так что я собираюсь взять несколько выстрелов в темноте здесь:

  • ExportFormat коллекция не является ObservableCollection (или более как правило, не реализует INotifyCollectionChanged).

  • Если это действительно ObservableCollection, вы назначаете его напрямую, вместо того чтобы очищать его элементы и добавлять новые. Пример:

    ExportFormat = MyNewObsCollection; //Bad

ExportFormat.Clear();

foreach(var newItem in myNewObsCollection) 
{ 
    ExportFormat.Add(newItem); //Good 
} 

Side Примечание: ExportFormat должен быть доступен только для чтения

+0

ok, так что я решил проблему, просто изменив тип ExportFormat на ObjectModel.ObservableCollection (Of String), это был List (of String) раньше. Ну, что странно, почему он не работал со списком и работал с ObservableCollection! – Rui

+0

На самом деле так оно и должно быть: списки не предоставляют механизм обновления, встроенный для WPF. ObservableCollection вызывает CollectionChanged всякий раз, когда вы изменяете коллекцию, и WPF подписывается на это событие. –

0

Благодаря @Baboon за предоставленную мне немного света на эту проблему. Таким образом, решение моей проблемы:

Так что мой ExportFormat собственность была определена как:

Private _ExportFormat As New List(Of String) 
Public Property ExportFormat As List(Of String) 
Get 
Return _ExportFormat 
End Get 
Set(value As List(Of String)) 
_ExportFormat = value 
NotifyPropertyChanged("ExportFormat") 
End Set 
End Property 

и я просто должен был изменить список (из строки) в ObjectModel.ObservableCollection (Of String) ..

Private _ExportFormat As New ObjectModel.ObservableCollection(Of String) 
Public Property ExportFormat As ObjectModel.ObservableCollection(Of String) 
Get 
     Return _ExportFormat 
End Get 
Set(value As ObjectModel.ObservableCollection(Of String)) 
_ExportFormat = value 
NotifyPropertyChanged("ExportFormat") 
End Set 
End Property 

И мои проблемы решены. Спасибо еще раз!

Смежные вопросы