Я совершенно новичок в этом языке, поэтому мне кажется, что это немного глупый вопрос ..
Я пытаюсь создать меню гамбургеров с помощью фреймворка MahApps.Metro на примере его репозиторий примеров , версия V4 с MVVM.
Копируя всю структуру своего примера, он работает правильно, но теперь я не знаю, как продолжить. Я не знаю, как получить свойства моей MainViewModel из моей SearchViewModel, потому что при доступе к объекту я не вижу его свойств.
Кроме того, я не знаю, как связать эти свойства или как связать кнопку в SearchView.xaml с действием, которое использует свойства MainViewModel.
Это все мои соответствующие классы, но вы можете следовать примеру из его репозитория
MainWindow.xaml
<Window.DataContext>
<viewModels:MainViewModel />
</Window.DataContext>
<Grid.Resources>
<core:SelectedItemToContentConverter x:Key="SelectedItemToContentConverter" />
<!-- this is the template for the items (options too) -->
<DataTemplate x:Key="MenuItemTemplate" DataType="{x:Type Controls:HamburgerMenuIconItem}">
<Grid x:Name="RootGrid" Height="48" Background="Transparent">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="48" />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<ContentControl Grid.Column="0" HorizontalAlignment="Center" VerticalAlignment="Center" Content="{Binding Icon}" Focusable="False" />
<TextBlock Grid.Column="1" VerticalAlignment="Center" FontSize="16" Text="{Binding Label}" />
</Grid>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Controls:HamburgerMenu}}, Path=IsPaneOpen}" Value="False">
<Setter TargetName="RootGrid" Property="ToolTip" Value="{Binding ToolTip, Mode=OneWay}" />
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
<!-- these are the templates for the view models -->
<DataTemplate DataType="{x:Type viewModels:HomeViewModel}">
<views:HomeView DataContext="{Binding}" />
</DataTemplate>
<DataTemplate DataType="{x:Type viewModels:PrivateViewModel}">
<views:PrivateView DataContext="{Binding}" />
</DataTemplate>
<DataTemplate DataType="{x:Type viewModels:SettingsViewModel}">
<views:SettingsView DataContext="{Binding}" />
</DataTemplate>
<DataTemplate DataType="{x:Type viewModels:AboutViewModel}">
<views:AboutView DataContext="{Binding}" />
</DataTemplate>
<Controls:HamburgerMenu Grid.Row="1" x:Name="HamburgerMenuControl" HamburgerVisibility="Hidden" HamburgerWidth="48" ItemTemplate="{StaticResource MenuItemTemplate}" ItemsSource="{Binding MenuItems}" IsPaneOpen="True" SelectedIndex="0" Style="{StaticResource HamburgerMenuCreatorsStyle}" OpenPaneLength="350" VerticalScrollBarOnLeftSide="False" Grid.RowSpan="3" Grid.ColumnSpan="2">
<!-- select the tag (ViewModel) of the selected item (options item) -->
<Controls:HamburgerMenu.Content>
<MultiBinding Converter="{StaticResource SelectedItemToContentConverter}">
<Binding FallbackValue="{x:Null}" Mode="OneWay" Path="SelectedItem.Tag" RelativeSource="{RelativeSource Self}" />
<Binding FallbackValue="{x:Null}" Mode="OneWay" Path="SelectedOptionsItem.Tag" RelativeSource="{RelativeSource Self}" />
</MultiBinding>
</Controls:HamburgerMenu.Content>
</Controls:HamburgerMenu>
</Grid.Resources>
Базовая модель PropertyChangedViewModel
using System.ComponentModel;
using System.Runtime.CompilerServices;
using JetBrains.Annotations;
namespace ExampleProject.ViewModels
{
public class PropertyChangedViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
}
MainViewModel
namespace ExampleProject.ViewModels
{
public class MainViewModel : PropertyChangedViewModel
{
private HamburgerMenuItemCollection _menuItems;
private HamburgerMenuItemCollection _menuOptionItems;
public MainViewModel()
{
this.CreateMenuItems();
}
public void CreateMenuItems()
{
MenuItems = new HamburgerMenuItemCollection
{
new HamburgerMenuIconItem()
{
Icon = new PackIconMaterial() {Kind = PackIconMaterialKind.Magnify},
Label = "Search Item",
ToolTip = "The Search view.",
Tag = new SearchViewModel(this)
},
new HamburgerMenuIconItem()
{
Icon = new PackIconMaterial() {Kind = PackIconMaterialKind.CreditCardOutline},
Label = "Payment item",
ToolTip = "Payment.",
Tag = new PaymentViewModel(this)
},
new HamburgerMenuIconItem()
{
Icon = new PackIconMaterial() {Kind = PackIconMaterialKind.BookmarkMultipleOutline},
Label = "The Bookmarks",
ToolTip = "The bookmarks item.",
Tag = new BookmarksViewModel(this)
}
};
MenuOptionItems = new HamburgerMenuItemCollection
{
new HamburgerMenuIconItem()
{
Icon = new PackIconMaterial() {Kind = PackIconMaterialKind.Help},
Label = "About",
ToolTip = "Some help.",
Tag = new AboutViewModel(this)
}
};
}
public HamburgerMenuItemCollection MenuItems
{
get { return _menuItems; }
set
{
if (Equals(value, _menuItems)) return;
_menuItems = value;
OnPropertyChanged();
}
}
public HamburgerMenuItemCollection MenuOptionItems
{
get { return _menuOptionItems; }
set
{
if (Equals(value, _menuOptionItems)) return;
_menuOptionItems = value;
OnPropertyChanged();
}
}
}
}
SearchViewModel
namespace ExampleProject.ViewModels
{
public class SearchViewModel : PropertyChangedViewModel
{
private readonly PropertyChangedViewModel _mainViewModel;
public SearchViewModel(PropertyChangedViewModel mainViewModel)
{
_mainViewModel = mainViewModel;
}
}
}
SearchView.xaml
<UserControl x:Class="ExampleProject.Views.SearchView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:ExampleProject.Views"
mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="800">
<Grid>
<TextBlock Text="Search View"
FontSize="32"
HorizontalAlignment="Center"
VerticalAlignment="Center" />
</Grid>
</UserControl>
SearchView.xaml (код позади)
namespace ExampleProject.Views
{
/// <summary>
/// Logic of interaction for SearchtView.xaml
/// </summary>
public partial class SearchView : UserControl
{
public SearchView()
{
InitializeComponent();
}
}
}
Спасибо.