将控件绑定到类文件 MVVM WPF C#



我还在学习 wpf 和 c#,最近发现了类似 mvvm :)我试图将我的项目重建到它,但我坚持将控件绑定到.cs文件

我有来自MahApps的汉堡菜单和类似的东西

MainView.xaml

  <controls:HamburgerMenu x:Name="HamburgerMenuControl"
                            IsPaneOpen="False"
                            ItemsSource="{Binding Menu}"
                            OptionsItemsSource="{Binding OptionsMenu}"
                            ItemInvoked="{Binding HamburgerMenuControl_OnItemInvoked}"
                            ItemTemplate="{StaticResource MenuItemTemplate}"
                            OptionsItemTemplate="{StaticResource MenuItemTemplate}"
                            DisplayMode="CompactInline" />

我想在视图模型命名空间中使用汉堡菜单控件,如何将其绑定到该主视图模型.cs文件

这就是我的主视图模型.cs

using System.Windows.Navigation;
using System.Threading.Tasks;
using MahApps.Metro.Controls;
using MenuItem = MainViewModel.ViewModels.MenuItem;
using Prism.Mvvm;
using MainViewModel.ViewModels;
namespace MainViewModel.ViewModels
{
 public partial class MainViewModel: MetroWindow
    {
        public MainViewModel()
        {
            Navigation.Navigation.Frame = new Frame() { NavigationUIVisibility = NavigationUIVisibility.Hidden };
        Navigation.Navigation.Frame.Navigated += SplitViewFrame_OnNavigated;
        this.Loaded += (sender, args) => Navigation.Navigation.Navigate(new Uri("Views/LogoView.xaml", UriKind.RelativeOrAbsolute));
    }
    private void SplitViewFrame_OnNavigated(object sender, NavigationEventArgs e)
    {
        this.HamburgerMenuControl.Content = e.Content;
        this.HamburgerMenuControl.SelectedItem = e.ExtraData ?? ((ShellViewModel)this.DataContext).GetItem(e.Uri);
        this.HamburgerMenuControl.SelectedOptionsItem = e.ExtraData ?? ((ShellViewModel)this.DataContext).GetOptionsItem(e.Uri);
    }

    private void HamburgerMenuControl_OnItemInvoked(object sender, HamburgerMenuItemInvokedEventArgs e)
    {
        var menuItem = e.InvokedItem as MenuItem;
        if (menuItem != null && menuItem.IsNavigation)
        {
            Navigation.Navigation.Navigate(menuItem.NavigationDestination, menuItem);
        }
    }
}

我尝试了谷歌的一些提示,但我仍然收到错误'MainViewModel' does not contain a definition for 'HamburgerMenuControl' and no extension method 'HamburgerMenuControl' accepting a first argument of type 'MainViewModel'

你有什么建议吗?谢谢

从 ViewModel 访问视图(UI 元素(是非常糟糕的做法。MVVM 的全部目的是分离关注点。在这里,查看此 MVVM 教程

您应该在视图模型中公开属性,并在视图中绑定到它。在这种情况下,您的 ViewModel 应包含 MenuMenuOptions 属性(我猜是ObservableCollection<T>(。

此外,为了使您的MainViewModel成为实际的ViewModel,它不应该继承MetroWindow,这是MahApps的UI组件。但是,您的MainWindow可能应该继承自MetroWindow

这是

您的绑定:

ItemsSource="{Binding Menu}"

它将绑定到页面绑定(尚未发布(中名为 Menu 的属性,但它是应绑定到视图模型的页面。

TLDR@Sulli的建议是正确的,但如果你尊重视图模型中的视图,反之亦然,它确实否定了 MVVM 的目的。 看看你正在做什么,你可能会发现最好从你的视图中将上面的代码放在代码隐藏模块中。

严格来说,视图模型之间的通信可能是您希望使用消息传递系统执行的操作。

相关内容

  • 没有找到相关文章

最新更新