visual studio microsoft español descargar community wpf xaml styles datatemplate menuitem

wpf - microsoft - visual studio installer



¿Cómo puedo enlazar dinámicamente y agregar estáticamente MenuItems? (1)

Estoy vinculando el ItemsSource de mi MenuItem a un ObservableCollection en mi ViewModel. Aquí está mi xaml:

<MenuItem Header="_View" ItemsSource="{Binding Windows}"> <MenuItem.ItemContainerStyle> <Style> <Setter Property="MenuItem.Header" Value="{Binding Title}" /> </Style> </MenuItem.ItemContainerStyle> </MenuItem>

Esta parte funciona bien, pero ahora también quiero agregar algunos elementos de menú estáticos al mismo elemento de menú de vista, separados por un separador. Algo así, aunque sé que esto no funcionará porque no puedo configurar los elementos dos veces.

<MenuItem Header="_View" ItemsSource="{Binding Windows}"> <MenuItem.ItemContainerStyle> <Style> <Setter Property="MenuItem.Header" Value="{Binding Title}" /> </Style> </MenuItem.ItemContainerStyle> <Separator /> <MenuItem Header="item 1" /> <MenuItem Header="item 2" /> </MenuItem>

Por ahora, he creado una solución al agregar otro nivel al MenuItem como este:

<MenuItem Header="_View"> <MenuItem Header="Windows" ItemsSource="{Binding Windows}"> <MenuItem.ItemContainerStyle> <Style> <Setter Property="MenuItem.Header" Value="{Binding Title}" /> </Style> </MenuItem.ItemContainerStyle> </MenuItem> <MenuItem Header="Load Layout" /> <MenuItem Header="Save Layout" /> </MenuItem>

Esto funciona bien, pero prefiero no tener un submenú si es posible. Ah, y también preferiría hacer esto en xaml en lugar de código detrás. ¿Algunas ideas?


Puede usar CompositeCollection para hacer esto, puede combinar diferentes Colecciones y agregar elementos estáticos en el xaml.

Ejemplo:

Xaml:

<Window x:Class="WpfApplication8.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="233" Width="143" Name="UI"> <Window.Resources> <CollectionViewSource Source="{Binding ElementName=UI, Path=Windows}" x:Key="YourMenuItems"/> </Window.Resources> <Grid DataContext="{Binding ElementName=UI}"> <Menu Height="24" VerticalAlignment="Top"> <MenuItem Header="_View" > <MenuItem Header="Windows"> <MenuItem.ItemsSource> <CompositeCollection> <CollectionContainer Collection="{Binding Source={StaticResource YourMenuItems}}" /> <MenuItem Header="Menu Item 1" /> <MenuItem Header="Menu Item 2" /> <MenuItem Header="Menu Item 3" /> </CompositeCollection> </MenuItem.ItemsSource> <MenuItem.ItemContainerStyle> <Style> <Setter Property="MenuItem.Header" Value="{Binding Title}"/> </Style> </MenuItem.ItemContainerStyle> </MenuItem> </MenuItem> </Menu> </Grid> </Window>

Código

public partial class MainWindow : Window { private ObservableCollection<MyObject> _windows = new ObservableCollection<MyObject>(); public MainWindow() { InitializeComponent(); Windows.Add(new MyObject { Title = "Collection Item 1" }); Windows.Add(new MyObject { Title = "Collection Item 2" }); } public ObservableCollection<MyObject> Windows { get { return _windows; } set { _windows = value; } } } public class MyObject { public string Title { get; set; } }

Resultado: