Khi tôi ràng buộc Menu Items với một ObservableCollection, chỉ có "bên trong" khu vực của MenuItem là nhấp được:Làm cách nào để gắn kết một ObservableCollection của ViewModels với một MenuItem?
alt text http://tanguay.info/web/external/mvvmMenuItems.png
Trong tôi Xem Tôi có menu này:
<Menu>
<MenuItem
Header="Options" ItemsSource="{Binding ManageMenuPageItemViewModels}"
ItemTemplate="{StaticResource MainMenuTemplate}"/>
</Menu>
Sau đó, Tôi liên kết nó với số này DataTemplate:
<DataTemplate x:Key="MainMenuTemplate">
<MenuItem
Header="{Binding Title}"
Command="{Binding DataContext.SwitchPageCommand,
RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Menu}}}"
Background="Red"
CommandParameter="{Binding IdCode}"/>
</DataTemplate>
Vì mỗi ViewModel trong ObservableCollection ManageMenuPageItemViewModels có một tài sản Tiêu đề và IdCode, các mã trên hoạt động tốt ngay từ cái nhìn đầu tiên.
TUY NHIÊN, vấn đề là các MenuItem trong DataTemplate thực là bên trong khác MenuItem (như thể nó đang được ràng buộc hai lần) để trong DataTemplate ở trên với Background =" Màu đỏ " có một hộp màu Màu đỏ bên trong mỗi mục menu và chỉ có thể nhấp vào khu vực này, không phải toàn bộ khu vực mục menu (ví dụ: nếu người dùng nhấp vào khu vực có dấu kiểm hoặc sang phải hoặc trái của cl bên trong khu vực có thể xảy ra, sau đó không có gì xảy ra, trong đó, nếu bạn không có màu sắc riêng biệt thì rất khó hiểu.)
Cách chính xác để ràng buộc MenuItems là một ObservableCollection của ViewModels sao cho toàn bộ khu vực bên trong mỗi MenuItem là có thể nhấp?
UPDATE:
Vì vậy, tôi đã thực hiện những thay đổi sau đây dựa trên những lời khuyên dưới đây và bây giờ có điều này:
alt text http://tanguay.info/web/external/mvvmMenuItemsYellow.png
Tôi chỉ có một TextBlock bên trong DataTemplate của tôi, nhưng tôi vẫn không thể "tô màu toàn bộ MenuItem" nhưng chỉ có TextBlock:
<DataTemplate x:Key="MainMenuTemplate">
<TextBlock Text="{Binding Title}"/>
</DataTemplate>
Và tôi đặt lệnh ràng buộc vào Menu.ItemCo ntainerStyle nhưng họ không bắn bây giờ:
<Menu DockPanel.Dock="Top">
<Menu.ItemContainerStyle>
<Style TargetType="MenuItem">
<Setter Property="Background" Value="Yellow"/>
<Setter Property="Command" Value="{Binding DataContext.SwitchPageCommand,
RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Menu}}}"/>
<Setter Property="CommandParameter" Value="{Binding IdCode}"/>
</Style>
</Menu.ItemContainerStyle>
<MenuItem
Header="MVVM" ItemsSource="{Binding MvvmMenuPageItemViewModels}"
ItemTemplate="{StaticResource MainMenuTemplate}"/>
<MenuItem
Header="Application" ItemsSource="{Binding ApplicationMenuPageItemViewModels}"
ItemTemplate="{StaticResource MainMenuTemplate}"/>
<MenuItem
Header="Manage" ItemsSource="{Binding ManageMenuPageItemViewModels}"
ItemTemplate="{StaticResource MainMenuTemplate}"/>
</Menu>
+1 - rất hay cho ví dụ đầy đủ với Dấu tách và mọi thứ. –
Tôi có thiết kế rất giống nhau và mọi thứ hoạt động ngoại trừ việc hiển thị dấu phân cách. Nếu tôi thay đổi mẫu thành thì tôi sẽ thấy "Dấu phân cách" trong đó dấu phân cách phải. Nhưng khi tôi cố gắng sử dụng các mẫu như trong câu trả lời của bạn không có gì được hiển thị. Tôi đã thử và sau đó dấu phân cách hiển thị nhưng tôi muốn kiểu mặc định với chiều rộng được thiết lập động theo chiều rộng trình đơn. Tôi có nên định nghĩa SeparatorStyleKey ở đâu đó không? Tôi đã tìm kiếm trực tuyến nhưng không thể tìm thấy bất kỳ thứ gì đã giúp ...Cảm ơn! –
Dina