wpf - 如何在设计模式下从 ObjectDataProvider 获取 “null”?

标签 wpf xaml data-binding

我将其中一个 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/

相关文章:

c# - 绑定(bind)数据模板文本 block 标签

c# - WPF 控件和边距与窗口大小成比例

c# - 如何在 C# 的 WPF Modern UI 中通过按钮导航链接?

c# - Asp.NET ListView数据控件动态Databind

spring - 自定义属性编辑器不适用于 Spring MVC 中的请求参数?

c# - 帮助 WPF 中的物理模拟

wpf - 从 UserControl 控制窗口关闭

c# - VS WPF设计器: how to add control from referenced project to a form in the main project

c# - XAML- 如何将图像添加到 <TabControl> 标记

angular - 保留未分配的 Angular 组件 @Input