Wpf 将ViewModelBase移动到可移植类库

Wpf 将ViewModelBase移动到可移植类库,wpf,portable-class-library,Wpf,Portable Class Library,我正在尝试使用可移植类库来为我自己的MVVM框架减少每个平台的程序集 所以我现在有了这段代码(灵感来自@lbugnion MVVMLight) #如果银光 _isInDesignMode = DesignerProperties.IsInDesignTool; #否则 #恩迪夫 但当我试图在PCL中使用它时,它无法识别DesignerProperty和FrameworkElement等。 我应该如何克服这个问题 谢谢 您可以像我在MVVM Lig

我正在尝试使用可移植类库来为我自己的MVVM框架减少每个平台的程序集

所以我现在有了这段代码(灵感来自@lbugnion MVVMLight)

#如果银光
                        _isInDesignMode = DesignerProperties.IsInDesignTool;
#否则 #恩迪夫 但当我试图在PCL中使用它时,它无法识别DesignerProperty和FrameworkElement等。 我应该如何克服这个问题


谢谢

您可以像我在MVVM Light PCL fork中一样执行此操作:


使用反射加载和调用适当的调用。

我认为您不应该将此代码直接包含在PCL中。pcl的路线图看起来不错,但我怀疑FrameworkElement在短期内是否可以移植

要么:

  • 删除此设计时代码
  • 或者将此代码抽象出来,以便通过特定于平台的接口调用它。请参阅msdn上的平台抽象技术-
  • 或者使用@Oren答案中的反射技术

您真的不应该在PCL中使用依赖于平台的调用。PCL的目的是共享所有目标平台通用的代码。

如果您必须使用一些特定于平台的调用,那么使用依赖项注入和IoC来隐藏实际的实现,并在PCL中仅使用接口类型,这应该可以正常工作。

在我看来,这是少数几个使用反射从PCL调用特定于平台的代码的情况之一。您只需要知道您是否正在设计器中运行。不幸的是,对于XAML UI堆栈的不同变体,这是以不同的方式公开的。如果这是您唯一需要的特定于平台的东西,那么可能不值得为每个平台创建特定于平台的库,并让用户引用额外的库来避免在PCL中使用这种类型的反射代码/cc@MartinSuchan
                        _isInDesignMode = DesignerProperties.IsInDesignTool;
                var prop = DesignerProperties.IsInDesignModeProperty;
                _isInDesignMode
                    = (bool)DependencyPropertyDescriptor
                                 .FromProperty(prop, typeof(FrameworkElement))
                                 .Metadata.DefaultValue;

                // Just to be sure
                if (!_isInDesignMode.Value
                    && Process.GetCurrentProcess().ProcessName.StartsWith("devenv", StringComparison.Ordinal))
                {
                    _isInDesignMode = true;
                }
            }

            return _isInDesignMode.Value;
        }
    }

}