设计时XAML的默认值

She*_*ock 22 wpf xaml binding default

我有一个绑定的TextBlockXAML:

<TextBlock Text="{Binding MyText}"/>
Run Code Online (Sandbox Code Playgroud)

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

谢谢

Scr*_*og1 41

如果您希望Ian Bamforth的答案简洁,那么您可以这样做

<TextBlock Text="{Binding MyText, FallbackValue=None}"/>
Run Code Online (Sandbox Code Playgroud)

  • d:Text 听起来不错,但目前仅限于“WPF .NET Core 和 UWP 项目” (5认同)
  • @jvcleave:他们引入了修复程序。此功能也适用于预览通道中的 .NET Framework。要启用它,请转到“工具”&gt;“选项”&gt;“环境”&gt;“预览功能”,选择“用于 .NET Framework 的新 WPF XAML 设计器”,然后重新启动 Visual Studio。 (5认同)
  • 有没有办法只设计一个设计时间后备值? - 如果我的视图模型中的属性为null,我不希望显示这些值. (4认同)

IBa*_*Bam 8

改编这个问题的一个例子.

这适用于我 - 设计师显示"无"字样:

 <TextBlock>
    <TextBlock.Text>
        <Binding ElementName="root" Path="blah" FallbackValue="None" />
    </TextBlock.Text>
</TextBlock>
Run Code Online (Sandbox Code Playgroud)

希望有所帮助

  • 我对此进行了低估,因为FallbackValue是无法解析绑定时显示的值.如果在XAML中指定datacontext(或datacontexttype),则此解决方案不起作用,因为可以成功解析绑定(在我的情况下,元素已折叠,在设计时我不想要) (7认同)

Tho*_*que 5

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

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

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

<TextBlock Text="{my:BindingEx Name, DesignValue=John Doe}" />
Run Code Online (Sandbox Code Playgroud)

请注意,BindingEx没有来自 的所有属性Binding,但您可以在必要时轻松添加它们。