我有一个绑定的TextBlock
,XAML:
<TextBlock Text="{Binding MyText}"/>
我知道如果Binding不可用,FallbackValue
可以使用,但这是在运行时发生的吗?有没有办法在设计时显示默认值?如果我在设计窗口而不是空TextBlock
时看到一个值,它会使事情变得更容易。
由于
答案 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”