打不到 属性 的 getter
Cannot hit the getter of Property
我正在尝试在 Prism 中使用 AvalonDock。除 MenuItem "Tools->Properties" 外,一切正常。 MenuItem "File->New" 工作正常 - 创建了新的 window,我可以停靠在任何我想要的地方。
这段代码在简单的 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;
}
和视图模型:
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 Workspace
.
处触发 属性 FileStats
如何触发我的 属性?我做错了什么?
Prism 对 WPF 绑定系统没有影响,因此这是您如何创建与视图的 DataContext 的绑定的问题。您如何将 ViewModel 分配给 View 的 DataContext?检查您的输出 window 是否存在绑定错误。可能是您的 DataContext 未设置。
如果您使用的是 ViewModelLocator,请确保您遵循正确的命名约定:
http://brianlagunas.com/getting-started-prisms-new-viewmodellocator/
编辑: 我 运行 你的应用程序是这样的,并且能够在你的 FileStats.IsVisible [=25= 上点击 setter ].如果您在 FileStats 的 getter 上放置一个断点,那么当您单击菜单项时它不会触发,因为您绑定到 FileStats 的 属性,而不是读取的 FileStats -无论如何。顺便说一下,您知道 Prism 6.1 已经发布(您使用的是 v4)。另外,您应该尝试使用 NuGet 而不是硬引用。
我正在尝试在 Prism 中使用 AvalonDock。除 MenuItem "Tools->Properties" 外,一切正常。 MenuItem "File->New" 工作正常 - 创建了新的 window,我可以停靠在任何我想要的地方。
这段代码在简单的 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;
}
和视图模型:
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 Workspace
.
FileStats
如何触发我的 属性?我做错了什么?
Prism 对 WPF 绑定系统没有影响,因此这是您如何创建与视图的 DataContext 的绑定的问题。您如何将 ViewModel 分配给 View 的 DataContext?检查您的输出 window 是否存在绑定错误。可能是您的 DataContext 未设置。
如果您使用的是 ViewModelLocator,请确保您遵循正确的命名约定:
http://brianlagunas.com/getting-started-prisms-new-viewmodellocator/
编辑: 我 运行 你的应用程序是这样的,并且能够在你的 FileStats.IsVisible [=25= 上点击 setter ].如果您在 FileStats 的 getter 上放置一个断点,那么当您单击菜单项时它不会触发,因为您绑定到 FileStats 的 属性,而不是读取的 FileStats -无论如何。顺便说一下,您知道 Prism 6.1 已经发布(您使用的是 v4)。另外,您应该尝试使用 NuGet 而不是硬引用。