在XAML中,d:(设计时)的相反是什么?

3
我非常喜欢使用d:XYZ方法在设计时间标记某些属性,以便它们出现在Blend中,但在程序实际运行时不会显示。
d的相反是什么?我的目标是有两种不同的行为,一种在设计模式下,另一种在运行时。
例如,我希望“TestTest”在Blend中显示,但“productionTest”在运行时显示。
<TextBlock x:Name="FileText" 
           TextWrapping="Wrap" 
           d:Text="TestTest" 
           Text="productionTest" 
           HorizontalAlignment="Center"/>

7
不留下 d:? 是与拥有 d:? 相反的行为 :D :D - dev hedgehog
2
一种策略是使用与运行时视图模型形状相同的设计时视图模型。然后将其绑定到数据上下文,如... d:DataContext="{d:DesignData /SampleData/SerializedSampleData.xaml}" DataContext="{local:ViewModel}"这样做后,所有绑定到数据上下文的内容都将相同。设计时和运行时之间不需要进行任何更改。 - IntStarFoo
你列出的代码能用吗?有什么问题吗? - flup
3个回答

4

3

就像dev hedgehog所说的那样,相反的做法是:不使用它。

d:的使用是为了设计模式,这样你可以有类似以下的东西:

<Window ...
    Height="600"  Width="800"
    d:Height="200"  d:Width="300" >

需要在设计和运行时分别具有不同的设计高度/宽度。

有些框架实际上会帮助您完成这样的操作,例如(此示例特别来自MVVM-Light框架):

DataContext="{Binding Main, Source={StaticResource Locator}}"

您可以通过IsInDesignMode变量来设置不同的值,从而实现为设计时提供虚拟数据服务(例如随机日期列表),为运行时提供真实数据服务(例如来自数据库的真实日期)。

这样一来,您就不需要在每个页面上都担心设计/运行时的问题,因为框架会为您解决并提供正确的数据。


编辑:
根据您的评论... 您不能那样做。您要么必须依靠一些编码(选项1,时间会更长),要么依赖于一些框架(选项2,我的意见更好)。
无论哪种情况,您的XAML都将如下所示:

<TextBlock x:Name="FileText" 
       TextWrapping="Wrap" 
       Text="{Binding BlendabilityText}" 
       />

您需要在您的模型上创建一个public string类型的BlendabilityText属性。
选项1: 您需要创建包含以下属性的视图模型:'public string BlendabilityText { get; set; }',并且需要有2个构造函数。一个默认的空构造函数,当您处于设计模式时将被调用,默认情况下,您将初始化您的属性,如:BlendabilityText = "TestTest"; 在第二个构造函数中,您应该使用BlendabilityText = "ProductionValue"值执行相同的操作,它应该在运行时模式下被调用。 现在您应该看到正确的输出。
选项2: 使用MVVM-Light框架,您可以使用IsInDesignMode来初始化属性,在您的构造函数中添加以下代码:
if (IsInDesignMode)
{
    BlendabilityText = "TestTest";
}
else
{
    BlendabilityText = "ProductionTest";
}

现在,根据框架的IsInDesignMode,您的字符串将绑定到正确的值。

嘿,谢谢Noctis。我更新了我的问题以使其更清晰 - 有什么提示可以让测试文本出现吗?<TextBlock x:Name="FileText" TextWrapping="Wrap" d:Text="TestTest" Text="proctionText" HorizontalAlignment="Center"/> - stuck

2
您可以使用以下类。
public class Design : MarkupExtension
{
    readonly object realValue;
    readonly object designValue;

    public Design(object realValue, object designValue)
    {
        this.realValue = realValue;
        this.designValue = designValue;
    }

    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        var target = serviceProvider.GetService(typeof(IProvideValueTarget)) as IProvideValueTarget;
        if (target != null && target.TargetObject != null)
        {
            var obj = target.TargetObject as DependencyObject;
            if (obj != null && DesignerProperties.GetIsInDesignMode(obj))
                return designValue;
        }
        return realValue;
    }
}

like this

<TextBlock Text="{my:Design 'Real value', 'Design value'}" />

然而,这仍然会有(小的)性能开销(因为这不像 d:XYZ 一样被排除在编译之外)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接