Mam scenariusz, w którym muszę mieć zarówno statyczne, jak i dynamiczne elementy menu. Elementy statyczne zostaną zdefiniowane w XAML, a elementy dynamiczne dostarczone przez Model widoku. Każdy dynamiczny element sam będzie reprezentowany przez VieModel, nazwijmy go CommandViewModel. CommandViewModel ma między innymi nazwę wyświetlaną, może również zawierać inne CommandViewModels.Mieszanie dynamicznych i statycznych pozycji menu XAML
MainViewModel że przyzwyczaja jako datacontext do menu jest następująca:
public class MainMenuViewModel : INotifyPropertyChanged
{
private ObservableCollection<CommandViewModel> m_CommandVMList;
public MainMenuViewModel()
{
m_ CommandVMList = new ObservableCollection<CommandViewModel>();
CommandViewModel cmv = new CommandViewModel();
cmv.DisplayName = "Dynamic Menu 1";
m_CommandVMList.Add(cmv);
cmv = new CommandViewModel();
cmv.DisplayName = "Dynamic Menu 2";
m_CommandVMList.Add(cmv);
cmv = new CommandViewModel();
cmv.DisplayName = "Dynamic Menu 3";
m_CommandVMList.Add(cmv);
}
public ObservableCollection<CommandViewModel> CommandList
{
get { return m_CommandVMList; }
set
{
m_CommandVMList = value;
OnPropertyChanged("CommandList");
}
}
... ... ...
XAML Menu:
<Grid>
<Grid.Resources>
<HierarchicalDataTemplate DataType="{x:Type Fwf:CommandViewModel}" ItemsSource="{Binding Path=CommandViewModels}">
<MenuItem Header="{Binding Path=DisplayName}"/>
</HierarchicalDataTemplate>
</Grid.Resources>
<Menu VerticalAlignment="Top" HorizontalAlignment="Stretch">
<MenuItem Header="Static Top Menu Item 1">
<MenuItem Header="Static Menu Item 1"/>
<MenuItem Header="Static Menu Item 2"/>
<MenuItem Header="Static Menu Item 3"/>
<ItemsControl ItemsSource="{Binding Path= CommandList}"/>
<MenuItem Header="Static Menu Item 4"/>
</MenuItem>
</Menu>
</Grid>
Wszystko działa dobrze z wyjątkiem że cokolwiek próbuję reprezentować listę dynamicznych menu, w tym przypadku ItemsControl, jest pokazywane w interfejsie jako JEDNO Menu Ite m conatining więcej pozycji menu, więc cały zbiór dynamicznych elementów menu zostanie wybrany po kliknięciu na przedmiot. Kolekcja jest poprawnie przedstawiana, ponieważ każdy dynamiczny element menu jest wyświetlany jako pozycja menu, ale w obrębie tego większego elementu menu. Myślę, że rozumiem, dlaczego menu tworzy po prostu element menu dla każdego z zawartych w nim elementów, statycznego lub dynamicznego, którego nie obchodzi. Czy istnieje sposób, aby każdy element menu dynamicznego był tworzony na tym samym poziomie i należący do elementu menu nadrzędnego, jak te statyczne w przykładzie?
Tak chciałabym zrobić, ale niestety nie mogę, to dlatego przede wszystkim jest, że XAML jest dość dużo z moich rąk. Jest tworzony/zarządzany przez programistów aplikacji, po prostu używa mojego modelu, aby rozszerzyć swoje menu o elementy, które muszą być sterowane z kodu. –
To niefortunne. Czy istnieje sposób, aby zmienić XAML, aby skorzystać z CompositeCollection (http://msdn.microsoft.com/en-us/library/system.windows.data.compositecollection.aspx)? To nie jest idealne, ale może umożliwić wstrzykiwanie dynamicznych przedmiotów. Jedyną wadą, jaką widzę, jest sposób sortowania wynikowych elementów MenuItem, ale możesz to zrobić, traktując MenuItems, które są wcześniej jako jedna kolekcja, i MenuItems, które przychodzą potem jako kolejne. – micahtan
Micahtan - może powinieneś napisać rozwiązanie z klasą CompositeCollection do swojego posta? Ponieważ wydaje się, że jest to naprawdę dobry sposób na zrobienie tego. Dzięki, mam ten sam problem. – arconaut