Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 如何获得“;空”;在设计模式下从ObjectDataProvider?_Wpf_Xaml_Data Binding - Fatal编程技术网

Wpf 如何获得“;空”;在设计模式下从ObjectDataProvider?

Wpf 如何获得“;空”;在设计模式下从ObjectDataProvider?,wpf,xaml,data-binding,Wpf,Xaml,Data Binding,我将其中一个VM的实例放在一个资源字典中,如下所示: <ObjectDataProvider ObjectType="{x:Type WpfApplication1:MyViewModel}" x:Key="TheViewModel"/> 它在运行时运行良好,因为所有连接和服务器都可用,并且许多逻辑对象都已正确初始化 问题是,在设计阶段我遇到了很多异常(有很多这样的VM),这使得工作非常困难 在XAML中,如果CComponentModel:DesignerProperties.I

我将其中一个VM的实例放在一个资源字典中,如下所示:

<ObjectDataProvider ObjectType="{x:Type WpfApplication1:MyViewModel}" x:Key="TheViewModel"/>
它在运行时运行良好,因为所有连接和服务器都可用,并且许多逻辑对象都已正确初始化

问题是,在设计阶段我遇到了很多异常(有很多这样的VM),这使得工作非常困难

在XAML中,如果C
ComponentModel:DesignerProperties.IsInDesignMode(xmlns:ComponentModel=“clr namespace:System.ComponentModel;assembly=PresentationFramework”)
true
x:null
,否则创建我的VM
WPFAApplication1:MyViewModel
???
我做了很多尝试,但是没有找到正确的解决方案,但是我不敢相信这是不可能的。对于任何想法(可能是一个测试过的示例),请提前感谢。

我在过去处理此问题的方法包括为您的viewmodel提供一个接口,并让视图从viewmodel定位器类中请求其viewmodel。例如,您将拥有以下viewmodels:

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
}
viewmodel定位器如下所示:

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>

提供了另一个示例。请注意,我是在记事本中动态编写此代码的,因此如果出现任何打字错误,我深表歉意。

我相信您可以在
UserControl1
标记中使用以下内容来定义设计时
DataContext

xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
mc:Ignorable="d" 
d:DataContext="{x:Null}"
因为我通常不使用designer窗口,所以我没有实际测试过它,但理论上它应该可以工作:)

<WpfApplication1:UserControl1 x:Name="UsrCtrl1" DataContext="{Binding Path=MainViewModel, Source={StaticResource ViewModelLocator}}"/>
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
mc:Ignorable="d" 
d:DataContext="{x:Null}"