我试图在Prism中使用AvalonDock。除了MenuItem" Tools-> Properties"以外,一切正常。 MenuItem" File-> New"工作正常 - 新窗口创建,我可以停靠在任何我想要的地方。
此代码在简单的MVVM应用程序中运行正常(没有Prism) - “MenuItem”始终被触发。
我有什么:
<UserControl x:Class="ModuleCAvalonDock.ViewC">
<Menu>
<MenuItem Header="File">
<MenuItem Header="New" Command="{Binding NewCommand}"/>
<MenuItem Header="Open" Command="{Binding OpenCommand}"/>
<Separator/>
<MenuItem Header="Save" Command="{Binding ActiveDocument.SaveCommand}"/>
<MenuItem Header="Save As..." Command="{Binding ActiveDocument.SaveAsCommand}"/>
<Separator/>
<MenuItem Header="Close" Command="{Binding ActiveDocument.CloseCommand}"/>
</MenuItem>
<MenuItem Header="Tools">
<MenuItem Header="Properties" IsChecked="{Binding FileStats.IsVisible, Mode=TwoWay}" IsCheckable="True"/>
</MenuItem>
<MenuItem Header="Layout">
<MenuItem Header="Load" Command="{Binding LoadLayoutCommand, ElementName=mainWindow}"/>
<MenuItem Header="Save" Command="{Binding SaveLayoutCommand, ElementName=mainWindow}"/>
<MenuItem Header="Dump to Console" Click="OnDumpToConsole"/>
</MenuItem>
</Menu>
</UserControl>
我是如何约束的:
public ViewC(IViewModel viewModel)
{
InitializeComponent();
this.DataContext = Workspace.This;
}
和ViewModel:
public class Workspace:ViewModelBase
{
FileStatsViewModel _fileStats = null;
public FileStatsViewModel FileStats
{
get
{
if (_fileStats == null)
_fileStats = new FileStatsViewModel();
return _fileStats;
}
}
RelayCommand _newCommand = null;
public ICommand NewCommand
{
get
{
if (_newCommand == null)
{
_newCommand = new RelayCommand((p) => OnNew(p), (p) => CanNew(p));
}
return _newCommand;
}
}
private bool CanNew(object parameter)
{
return true;
}
private void OnNew(object parameter)
{
_files.Add(new FileViewModel());
ActiveDocument = _files.Last();
}
protected Workspace()
{
}
static Workspace _this = new Workspace();
public static Workspace This
{
get { return _this; }
}
}
FileStatsViewModel:
public class FileStatsViewModel : ToolViewModel { }
public class ToolViewModel
{
private bool _isVisible = true;
public bool IsVisible
{
get { return _isVisible; }
set
{
if (_isVisible != value)
{
_isVisible = value;
RaisePropertyChanged("IsVisible");
}
}
}
}
然而,它在Prism中不起作用。我已经尝试设置一些断点来检查属性是否被触发并且FileStats属性是在简单的MVVM应用程序中触发,但是FileStats属性没有在Prism应用程序中触发! 我初始化我的视图的代码:
public class ModuleCModule: ModuleBase
{
public ModuleCModule(IUnityContainer container, IRegionManager regionManager)
: base(container, regionManager) { }
protected override void InitializeModule()
{
RegionManager.RegisterViewWithRegion(RegionNames.ContentRegion, typeof(ViewC));
}
protected override void RegisterTypes()
{
Container.RegisterTypeForNavigation<ViewC>();
}
}
我可以发出命令<MenuItem Header="New" Command="{Binding NewCommand}"/>
,这真的很有趣。但是,我无法在viewModel FileStats
处触发属性Workspace
。
如何解雇我的财产?我做错了什么?
答案 0 :(得分:1)
Prism对WPF绑定系统没有影响,因此这是如何创建绑定到视图的DataContext的问题。如何将ViewModel分配给View的DataContext?检查输出窗口是否存在绑定错误。有可能你的DataContext没有被设置。
如果您使用的是ViewModelLocator,请确保遵循正确的命名约定:
http://brianlagunas.com/getting-started-prisms-new-viewmodellocator/
编辑:我按原样运行了您的应用,并且能够点击您的FileStats.IsVisible属性上的setter。如果你在FileStats的getter上放置一个断点,那么当你点击菜单项时就不会触发,因为你绑定了FileStats的属性,而不是FileStats,它是只读的。顺便说一句,你知道Prism 6.1已经出局了(你正在使用v4)。此外,您应该尝试使用NuGet而不是硬引用。