我将其中一个 VM 的实例放入资源字典中,例如:
<ObjectDataProvider ObjectType="{x:Type WpfApplication1:MyViewModel}" x:Key="TheViewModel"/>
我将某些用户控件的 DataContext
绑定(bind)到此:
<WpfApplication1:UserControl1 x:Name="UsrCtrl1" DataContext="{StaticResource TheViewModel}"/>
它在运行时运行良好,因为所有连接和服务器都可用,并且许多逻辑对象都已正确初始化。
问题是,在设计时我遇到了很多异常(有很多这样的 VM),这使得工作变得非常困难。
如果 ComponentModel:DesignerProperties.IsInDesignMode (xmlns:ComponentModel="clr-namespace:System.ComponentModel;assembly=PresentationFramework")
是 true
然后 x:null
,否则创建我的 VM WpfApplication1:MyViewModel
???
我尝试了很多,但无法找到正确的解决方案,但我无法相信这是不可能的。对于任何想法(也许是经过测试的示例),提前致谢。
最佳答案
我过去处理这个问题的方法包括为您的 View 模型提供一个接口(interface),并让 View 从 View 模型定位器类中请求它们的 View 模型。例如,您将拥有以下 View 模型:
public interface IMainViewModel
{
double Foo { get; }
double Bar { get; }
}
public class RealMainViewModel : IMainViewModel
{
// implementation of IMainViewModel, this one does your data access
// and is used at run time
}
public class FakeMainViewModel : IMainViewModel
{
// implementation of IMainViewModel, this one is fake
// and is used at design time
}
View 模型定位器如下所示:
public class ViewModelLocator
{
public static IMainViewModel MainViewModel
{
get
{
if (Designer.IsDesignMode)
{
return new FakeMainViewModel();
}
else
{
return new RealMainViewModel();
}
}
}
}
最后,您将在 App.xaml 中包含对 ViewModelLocator 的引用:
<Application.Resources>
<ResourceDictionary>
<yourNamespace:ViewModelLocator x:Key="ViewModelLocator" />
</ResourceDictionary>
</Application.Resources>
这样,您可以绑定(bind)到 ViewModelLocator 中的 viewmodel 属性,并让您的代码在适当的时候完成注入(inject)真实和虚假 viewmodel 的工作:
<WpfApplication1:UserControl1 x:Name="UsrCtrl1" DataContext="{Binding Path=MainViewModel, Source={StaticResource ViewModelLocator}}"/>
我还找到了an article这提供了另一个例子。请注意,我是在记事本中即时写下这段代码的,所以如果有任何拼写错误,我深表歉意。
关于wpf - 如何在设计模式下从 ObjectDataProvider 获取 “null”?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7039702/