无法击中物业的吸气剂

时间:2015-10-23 06:19:25

标签: c# wpf mvvm prism

我试图在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

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

1 个答案:

答案 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而不是硬引用。