设计时XAML的默认值

时间:2013-06-20 08:21:48

标签: wpf xaml binding default

我有一个绑定的TextBlock,XAML:

<TextBlock Text="{Binding MyText}"/>

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

由于

4 个答案:

答案 0 :(得分:40)

如果您希望使用较为详细的Ian Bamforth's answer版本,则可以执行

<TextBlock Text="{Binding MyText, FallbackValue=None}"/>

答案 1 :(得分:7)

调整this问题的示例。

这对我有用 - 设计师会显示“无”字样:

 <TextBlock>
    <TextBlock.Text>
        <Binding ElementName="root" Path="blah" FallbackValue="None" />
    </TextBlock.Text>
</TextBlock>

希望有所帮助

答案 2 :(得分:4)

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

我想出了一个模仿Binding的自定义标记扩展(理想情况下,我本来希望从Binding继承,但是ProvideValue方法不是虚拟的...): / p>

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);
        }
    }
}

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

<TextBlock Text="{my:BindingEx Name, DesignValue=John Doe}" />

请注意,BindingEx并不具有Binding中的所有属性,但是您可以根据需要轻松添加它们。

答案 3 :(得分:2)

如果你有这个数据绑定并且正在使用MVVM架构,那么为它绑定的模型项设置DEFAULT值将在设计时显示该值

我正在使用:

Model.cs:

private int frame = 999999;
public int Frame
{
  get { return frame; }
  set
  {
    frame = value;
    NotifyPropertyChanged(m => m.Frame);
  }
}

在我的XAML中:

 <TextBlock Text="{Binding Path=Frame}"  />

,设计器

中显示默认值“999999”