Внутри моего класса MainWindow у меня есть:Как установить DataContext в XAML для динамически модифицированного ObservableCollection
public ObservableCollection<ViewModel> VMs ..
MainWindow построен в XAML (он создает пустые виртуальные машины в конструкторе класса тоже):
<Window.Resources>
<c:MainViewModel x:Key="ViewModelsSource"/>
</Window.Resources>
Когда я нажимаю на кнопку, добавить объекты ViewModel к ObservableCollection виртуальных машин и содержание ObservableCollection показано в ListBox:
<StackPanel DataContext="{Binding Source={StaticResource ViewModelsSource}}">
<ListBox IsSynchronizedWithCurrentItem="True"
ItemsSource="{Binding VMs}"
Background="Transparent"
HorizontalContentAlignment="Stretch"
> ...
Код для Command Добавить это:
void AddListExecute()
{
VMs.Add(new ViewModel());
}
Конструктор для ViewModel является:
public class ViewModel : MainViewModel
{
//Private Members
private ObservableCollection<FeeViewModel> _fees;
//Properties
public ObservableCollection<FeeViewModel> FVMs
{
get
{
return _fees;
}
set
{
_fees = value;
}
}
//Constructor
public ViewModel()
{
this._fees = new ObservableCollection<FeeViewModel>();
}
...
Эта часть работает отлично. Каждый объект ViewModel содержит другой ObservableCollection:
public ObservableCollection<FeeViewModel> FVMs ..
У меня есть TabControl в XAML, который использует этот ObservableCollection делать вещи:
<TabControl
IsSynchronizedWithCurrentItem="True"
ItemsSource="{Binding FVMs, diag:PresentationTraceSources.TraceLevel=High}"
Style="{StaticResource EnabledTabs}" Grid.Column="1" Margin="0,0,10,0">
<TabControl.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
...
</StackPanel>
</DataTemplate>
</TabControl.ItemTemplate>
<TabControl.ContentTemplate>
<DataTemplate>
...
EnabledTabs стиль, который использует свойство в FeeViewModel:
<Style TargetType="{x:Type TabControl}" x:Key="EnabledTabs">
<Setter Property="IsEnabled" Value="{Binding GotFees}"/>
</Style>
Теперь у меня есть ошибка привязки, FVMs имеет значение null, и ничего не отображается в окне. Если я вернусь к предыдущей версии без объектов ObservableCollection из ViewModel, и я установил DataContext TabControl на этот единственный ViewModel, все будет работать нормально.
Как установить DataContext TabControl для динамически созданных объектов ViewModel?
Возможно ли сделать что-то вроде VM/FVM в привязке? Благодаря
ли 'FVMs' когда-либо инициализируется в любом месте? – Clemens
Проверка работоспособности: вы говорите, что ваши модели ViewModels содержат FVM ObservableCollection, но вы, видимо, связаны с чем-то, что называется FMV. Это просто опечатка здесь, или это в вашем коде? –
goobering
И это был бы прекрасный пример того, почему вы должны использовать разумные имена свойств. – Clemens