2015-04-12 3 views
0

Внутри моего класса 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 в привязке? Благодаря

+0

ли 'FVMs' когда-либо инициализируется в любом месте? – Clemens

+0

Проверка работоспособности: вы говорите, что ваши модели ViewModels содержат FVM ObservableCollection , но вы, видимо, связаны с чем-то, что называется FMV. Это просто опечатка здесь, или это в вашем коде? – goobering

+0

И это был бы прекрасный пример того, почему вы должны использовать разумные имена свойств. – Clemens

ответ

0

решаемые путем добавления DataContext в TabControl:

<TabControl 
     DataContext="{Binding VMs, Source={StaticResource ViewModelsSource}}" 
     IsSynchronizedWithCurrentItem="True" 
     ItemsSource="{Binding FVMs, diag:PresentationTraceSources.TraceLevel=High}" 
     Style="{StaticResource EnabledTabs}" Grid.Column="1" Margin="0,0,10,0"> 
Смежные вопросы