Переменная Publi c не отображается в списке учеников - PullRequest
0 голосов
/ 21 января 2020

Я совершенно новичок в этом языке, поэтому мне кажется, что это немного глупый вопрос ..

Я пытаюсь создать меню гамбургеров с помощью фреймворка MahApps.Metro на примере его репозиторий примеров , версия V4 с MVVM.

Копируя всю структуру своего примера, он работает правильно, но теперь я не знаю, как продолжить. Я не знаю, как получить свойства моей MainViewModel из моей SearchViewModel, потому что при доступе к объекту я не вижу его свойств.

enter image description here

enter image description here

Кроме того, я не знаю, как связать эти свойства или как связать кнопку в 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();
        }
    }
}

Спасибо.

1 Ответ

1 голос
/ 21 января 2020

PropertyChangedViewModel не имеет myGlobalVar, MainViewModel имеет.

вы должны разыграть mainViewModel до MainViewModel, потому что mainViewModel имеет тип PropertyChangedViewModel, а не MainViewModel .

((MainViewModel)mainViewModel).myGlobalVar = ...

Вот почему соблюдение «соглашений об именах» очень важно, если бы вы не назвали его в честь неправильного класса, вы бы не спутали его с другим классом.

Кроме того, чтобы привязка работала, член класса должен быть опубликованным c свойством, иначе он недоступен из XAML и не будет отображаться в XAML intellisense.

Если вы не хотите, чтобы он был опубликован c, вы должны использовать DependencyProperty.

...