【问题标题】:Cannot hit the getter of Property无法命中 Property 的 getter
【发布时间】:2015-10-23 21:43:23
【问题描述】:

我正在尝试在 Prism 中使用 AvalonDock。除了 MenuItem“工具-> 属性”之外,一切正常。 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>();
    }
}

我可以触发我的命令&lt;MenuItem Header="New" Command="{Binding NewCommand}"/&gt; 真的很有趣。但是,我不能在 viewModel Workspace 上触发属性 FileStats

如何解雇我的财产?我做错了什么?

【问题讨论】:

    标签: c# wpf mvvm prism


    【解决方案1】:

    Prism 对 WPF 绑定系统没有影响,因此这是您如何创建与视图的 DataContext 的绑定的问题。您如何将 ViewModel 分配给 View 的 DataContext?检查您的输出窗口是否存在绑定错误。很有可能您的 DataContext 没有被设置。

    如果您使用 ViewModelLocator,请确保遵循正确的命名约定:

    http://brianlagunas.com/getting-started-prisms-new-viewmodellocator/

    编辑:我按原样运行您的应用程序,并且能够点击您的 FileStats.IsVisible 属性上的设置器。如果您在 FileStats 的 getter 上放置断点,那么当您单击菜单项时不会触发,因为您绑定到 FileStats 的属性,而不是 FileStats,它无论如何都是只读的。顺便说一句,您知道 Prism 6.1 已经发布(您使用的是 v4)。此外,您应该尝试使用 NuGet 而不是硬引用。

    【讨论】:

    • 我可以触发我的命令 真的很有趣。但是,我无法在 viewModel 工作区触发属性 FileStats。
    • 查看我的更新答案。就像我说的,不是棱镜问题:)
    • 对不起,我已经粘贴了我原来的菜单。请看我更新的答案。然而,“属性”不会触发“IsVisible”属性。请帮我。我设置了断点,但断点没有触发。没用。
    • 您能否将您的示例上传到 GitHub,以便我可以在您所有其他代码的上下文中查看它?我按原样复制并粘贴了您拥有的所有内容,对我来说效果很好。我看不到您的项目中发生的其他事情可能导致此问题。
    • 是的,我已将示例上传到 GitHub:github.com/NiceStepUp/HelloWorld 请参阅
    猜你喜欢
    • 2011-01-09
    • 1970-01-01
    • 2019-03-27
    • 2014-06-26
    • 1970-01-01
    • 1970-01-01
    • 2019-06-26
    • 2020-07-01
    • 1970-01-01
    相关资源
    最近更新 更多