我还在学习 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 应包含 Menu
和 MenuOptions
属性(我猜是ObservableCollection<T>
(。
此外,为了使您的MainViewModel
成为实际的ViewModel,它不应该继承MetroWindow
,这是MahApps的UI组件。但是,您的MainWindow
可能应该继承自MetroWindow
。
您的绑定:
ItemsSource="{Binding Menu}"
它将绑定到页面绑定(尚未发布(中名为 Menu
的属性,但它是应绑定到视图模型的页面。
TLDR@Sulli的建议是正确的,但如果你尊重视图模型中的视图,反之亦然,它确实否定了 MVVM 的目的。 看看你正在做什么,你可能会发现最好从你的视图中将上面的代码放在代码隐藏模块中。
严格来说,视图模型之间的通信可能是您希望使用消息传递系统执行的操作。