如何为绑定到ViewModel属性的Silverlight TextBlock 提供设计时值?

3

我在XAML中有一个TextBlock,它的文本被绑定到我的视图模型中的一个属性。

<TextBlock x:Name="SomeText" Text="{Binding TheTextProperty}" />

这个工作得很好,但是在设计时,没有视图模型,所以属性是不可解析的,文本为空。在设计师中难以使用,因为它不显示任何可见文本。

我该如何指定一些在设计时使用的默认文本?

3个回答

12

也许你可以尝试一下

<TextBlock x:Name="SomeText" Text="{Binding TheTextProperty, FallbackValue='Some other text'}" />

此处所述


1
这里的风险在于,如果由于某种原因您的属性为Null,则fallbackvalue也将在运行时显示。根据您的情况,这可能不是理想的选择。 - Michael Brown
1
@Mike:我最初也是这样想的,但 MSDN 上说“在绑定无法返回值时使用的值”。我也试了一下,使用 null 作为绑定值不会导致显示 FallbackValue(可以使用 TargetNullValue 指定空值回退)。 - jCoder

7

您也可以使用设计时数据来提供丰富的绑定体验。虽然设置和运行有些麻烦,但以下是要点:

首先,在xaml中创建您的DataContext。将一个新的Xml文档添加到您的解决方案中(根目录是个不错的地方),并将其扩展名设置为.xaml。例如,我们在这个例子中称此文件为“foo.xaml”。

在此文件中,删除所有XML内容,并开始创建您的DataContext类型的实例。例如,如果您的DataContext是一个字符串(非常简单的例子),则该文件将如下所示:

<string xmlns="clr-namespace:System;assembly=mscorlib">LOL!</string>

你可能希望将你的页面外观设置为这样:
<ViewModel xmlns="clr-namespace:MyNamespace">
    <ViewModel.MyObservableCollection>
         <MyModel Name="foo" />
         <!-- etc -->

将此文件的生成操作设置为DesignDataWithDesignTimeCreatableTypes:

enter image description here

接下来,在您的视图中,将以下命名空间和属性添加到Window/UserControl的根目录中:

xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
d:DataContext="{d:DesignData Source=foo.xaml}"

Source是相对于当前文档的。因此,如果您的解决方案如下所示:

  • 视图
    • MyUserControl.xaml
  • 数据
    • foo.xaml

您将设置Source../Data/foo.xaml

根据ViewModel在设计时是否可以实例化,创建DesignData上下文的其他方法也有所不同。


这也是一个非常有趣的方法。对于复杂的设计时数据看起来非常有用。绝对值得收藏! - jCoder

0
另一个选项是使用DesignerProperties.GetIsInDesignMode函数来确定控件是否托管在VS / Blend中,并在这种情况下生成虚假的DataContext。Laurent Bugnion提供了许多示例,说明如何创建和使用设计时数据,在this post中可以找到。

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