首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >设计时的默认值XAML

设计时的默认值XAML
EN

Stack Overflow用户
提问于 2013-06-20 16:21:48
回答 4查看 15.6K关注 0票数 31

我有一个绑定的TextBlock,XAML:

代码语言:javascript
运行
复制
<TextBlock Text="{Binding MyText}"/>

我知道如果绑定不可用,可以使用FallbackValue,但这是在运行时发生的吗?有没有办法在设计时显示默认值?如果我在设计窗口时能看到一个值,而不是一个空的TextBlock,那会让事情变得更容易。

谢谢

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-06-25 21:45:05

更新:Visual Studio 2019 v16.7

您现在可以执行以下操作:

代码语言:javascript
运行
复制
<TextBlock Text="{Binding MyText}" d:Text="Design time value"/>

如果您想要一个不太冗长的Ian Bamforth's answer版本,您可以这样做

代码语言:javascript
运行
复制
<TextBlock Text="{Binding MyText, FallbackValue=None}"/>
票数 54
EN

Stack Overflow用户

发布于 2013-06-20 16:29:28

改编this问题中的一个例子。

这对我来说很有效--设计器中会显示文本"None“:

代码语言:javascript
运行
复制
 <TextBlock>
    <TextBlock.Text>
        <Binding ElementName="root" Path="blah" FallbackValue="None" />
    </TextBlock.Text>
</TextBlock>

希望这能有所帮助

票数 8
EN

Stack Overflow用户

发布于 2020-01-07 22:22:18

使用FallbackValue是错误的,因为它还会影响运行时行为(如果绑定无法从源获取值,则使用回退值)。

我想出了一个模仿Binding的自定义标记扩展(理想情况下,我更愿意从Binding继承,但ProvideValue方法不是虚拟的……):

代码语言:javascript
运行
复制
using System;
using System.ComponentModel;
using System.Windows;
using System.Windows.Data;
using System.Windows.Markup;

namespace MyNamespace
{
    public class BindingEx : MarkupExtension
    {
        private readonly Binding _binding;

        public BindingEx()
        {
            _binding = new Binding();
        }

        public BindingEx(string path)
        {
            _binding = new Binding(path);
        }

        public PropertyPath Path
        {
            get => _binding.Path;
            set => _binding.Path = value;
        }

        public BindingMode Mode
        {
            get => _binding.Mode;
            set => _binding.Mode = value;
        }

        public RelativeSource RelativeSource
        {
            get => _binding.RelativeSource;
            set => _binding.RelativeSource = value;
        }

        public string ElementName
        {
            get => _binding.ElementName;
            set => _binding.ElementName = value;
        }

        public IValueConverter Converter
        {
            get => _binding.Converter;
            set => _binding.Converter = value;
        }

        public object DesignValue { get; set; }

        public override object ProvideValue(IServiceProvider serviceProvider)
        {
            var target = (IProvideValueTarget)serviceProvider.GetService(typeof(IProvideValueTarget));
            if (target.TargetObject is DependencyObject d && DesignerProperties.GetIsInDesignMode(d))
                return DesignValue;

            return _binding.ProvideValue(serviceProvider);
        }
    }
}

通过添加DesignValue属性,您可以像使用Binding一样使用它:

代码语言:javascript
运行
复制
<TextBlock Text="{my:BindingEx Name, DesignValue=John Doe}" />

请注意,BindingEx没有Binding的所有属性,但如果需要,您可以很容易地添加它们。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17208665

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档