Ваш класс модели Foo, который я использую, был упрощен для этого примера, но пропущенный код может быть причиной вашей проблемы. Позвольте мне объяснить.
Foo также должен реализовать INotifyPropertyChanged, чтобы сообщить Listbox, когда вы инициализировали коллекцию Bars, и это наиболее определенно зависит от того, когда вы ее инициализируете.
Предположим, что инициализация Bars в конструкторе Foo приведет к привязке источника Listbox ItemsSource к действительной коллекции Bars.
public Foo()
{
Bars = new ObservableCollection<string>();
...
}
Но если вы сделали что-то подобное, Listbox не будет знать, что коллекция Bars была инициализирована, и не будет обновлять ее источник ...
public Foo SelectedFoo
{
get { return _selectedFoo; }
set
{
if (_selectedFoo == value)
{
return;
}
var oldValue = _selectedFoo;
_selectedFoo = value;
// Update bindings, no broadcast
RaisePropertyChanged(SelectedFooPN);
if(_selectedFoo.Bars == null)
{
_selectedFoo.Bars = new ObservableCollection<string>();
// ...
}
}
}
Также вот несколько вещей, которые вы могли бы пересмотреть в своем XAML.
Во-первых, привязка Textbox
по умолчанию TwoWay
, поэтому вам не нужно устанавливать Mode
или Path
.
<TextBox Text="{Binding UpdateSourceTrigger=PropertyChanged}" />
Во-вторых, нет смысла устанавливать Mode="TwoWay"
для ItemsSource
. ItemsSource = "{Binding Main.SelectedFoo.Bars , Mode = TwoWay }"
Наконец, вам не нужно устанавливать DataType
для вашего DataTemplate
. DataType = "{x: Тип системы: строка}"