【问题标题】:Disable DataContext for VS Disigner禁用 VS Designer 的数据上下文
【发布时间】:2011-08-29 09:19:39
【问题描述】:

我想禁用在 WPF 设计器中创建 DataContext 实例(在 VS 中不是混合)。 到目前为止我所做的是以下代码:

<Window ....
d:DataContext="{d:DesignInstance local:Class1, IsDesignTimeCreatable=True}">
    <Window.DataContext>
        <local:Class2 d:IsDesignTimeCreatable="False/>
    </Window.DataContext>
</Window>

虽然在设计时使用了 Class1 的数据,但仍在创建 Class2 的实例。

我知道我可以使用一些代码来检查我是否处于设计阶段,但我只想通过 XAML 解决这个问题!

有什么建议吗?

【问题讨论】:

  • 你打错了 :) d:DataContext="{d:DesignInstance local:Class1, IsDesignTimeCreatable=True}" and d:IsDesignTimeCreatable="False" />

标签: wpf xaml


【解决方案1】:

您可以查看附加属性DesignerProperties.IsInDesignMode。这里有一些建议,但没有一个看起来很干净,最后,我认为在代码中使用几行代码是最简单的解决方案。

  • 如果Style 中设置了DataContext 对象,我认为它不会被实例化(但这可能会在VS Designer 的未来升级中发生变化)
  • 您可以将DataContext 绑定到IsInDesignMode,该转换器返回Class2 的实例或null,具体取决于IsInDesignMode 的值
  • 使用DataTrigger。只有 Xaml,但要编写很多代码..

例子

<Window ...
        xmlns:pf="clr-namespace:System.ComponentModel;assembly=PresentationFramework">
    <Window.Style>
        <Style TargetType="Window">
            <Style.Triggers>
                <DataTrigger
                    Binding="{Binding RelativeSource={RelativeSource Self},
                                      Path=(pf:DesignerProperties.IsInDesignMode)}"
                    Value="False">
                    <Setter Property="DataContext">
                        <Setter.Value>
                            <local:Class2 />
                        </Setter.Value>
                    </Setter>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Window.Style>
    <!--...-->
</Window>

【讨论】:

  • 我不喜欢背后的代码。样式 + 触发器仍然是一个好主意。还是DataTrigger不正确,应该是Trigger。此外,您应该将样式外包到 ResourceDictionary,否则如果您单击 xaml 中的 节点,设计者往往会创建数据上下文的实例。
猜你喜欢
  • 1970-01-01
  • 2014-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多