2016-02-28 5 views
0

Я пытаюсь использовать динамический элемент меню, используя MVVM из наблюдаемой коллекции. Все сработало, но потом мне нужно было добавить кнопку «добавить новую» в конец. Я нашел решение, используя CompositeCollection, как здесь:Динамическое связывание и статическое добавление MenuItems - с использованием представления Модели/MVVM

How do I dynamically bind and statically add MenuItems?

Так есть следующий код, где TimeSpans представляет собой набор ViewModels:

<MenuItem Header="Time Ranges"> 
     <MenuItem.ItemsSource> 
      <CompositeCollection> 
       <CollectionContainer Collection="{Binding TimeSpans}" /> 
       <Separator /> 
       <MenuItem Header="Add New" cal:Message.Attach="NewTimeSpan()" /> 
      </CompositeCollection> 
     </MenuItem.ItemsSource> 
     <MenuItem.ItemTemplate> 
      <ItemContainerTemplate> 
       <MenuItem Header="{Binding Name}" cal:Message.Attach="ConfigureTimeSpan()" /> 
      </ItemContainerTemplate> 
     </MenuItem.ItemTemplate> 
    </MenuItem> 

Однако модели ракурса не заселена, как это было только с помощью ItemsSource = "{Binding TimeSpans}", он не показывает ничего:

enter image description here

Я подозреваю, что это потому, что я в ответе StackOverflow выше привязки - это, фактически, коллекция MenuItems, так что составная коллекция имеет смысл. В то время как минные миксы ViewModels & MenuItems.

Есть ли способ построить коллекцию элементов меню, созданных из ViewModels в XAML, чтобы я мог ее связать?

+1

Вы пробовали это? ' '. Как и в связанном ответе, используйте ресурс. Насколько я помню, это нужно для 'CompositeCollection'. –

+0

Кажется, придумал тот же результат. Я обновляю xaml в вопросе, хотя, поскольку вы правы, я полностью пропустил это в другом ответе. Благодарю. – Joe

+0

Ах! Понял. Путь должен быть DataContext.TimeSpans, так как {Binding TimeSpans} является короткой средой для рамки Caliburn.Micro MVVM, которую я использую. Большое спасибо! – Joe

ответ

0

Для всех, кто сталкивается с этим, как сказал Сабольч Деззи, мне нужно было использовать ресурс для CollectionViewSource (плохое понимание прочитанного с моей стороны, как это было в ответе, связанном с моим вопросом).

Рабочий код ниже:

<MenuItem Header="Time Ranges" x:Name="TimeRangesMenuItem"> 
    <MenuItem.Resources> 
     <CollectionViewSource Source="{Binding ElementName=TimeRangesMenuItem, Path=TimeSpans}" x:Key="TimeSpanMenuItems" /> 
    </MenuItem.Resources> 
    <MenuItem.ItemsSource> 
     <CompositeCollection> 
      <CollectionContainer Collection="{Binding Source={StaticResource TimeSpanMenuItems}}" /> 
      <Separator /> 
      <MenuItem Header="Add New" cal:Message.Attach="NewTimeSpan()" /> 
     </CompositeCollection> 
    </MenuItem.ItemsSource> 
    <MenuItem.ItemTemplate> 
     <ItemContainerTemplate> 
      <MenuItem Header="{Binding Name}" cal:Message.Attach="ConfigureTimeSpan()" /> 
     </ItemContainerTemplate> 
    </MenuItem.ItemTemplate> 
</MenuItem>