我有一个绑定的TextBlock
,XAML:
<TextBlock Text="{Binding MyText}"/>
我知道如果绑定不可用,可以使用FallbackValue,但这是在运行时发生的吗?有没有办法在设计时显示默认值?如果我能在设计窗口时看到一个值而不是一个空的TextBlock,那会让事情变得更容易。谢谢。
我有一个绑定的TextBlock
,XAML:
<TextBlock Text="{Binding MyText}"/>
我知道如果绑定不可用,可以使用FallbackValue,但这是在运行时发生的吗?有没有办法在设计时显示默认值?如果我能在设计窗口时看到一个值而不是一个空的TextBlock,那会让事情变得更容易。现在你可以:
<TextBlock Text="{Binding MyText}" d:Text="Design time value"/>
如果你希望看到一个更简洁的版本,可以直接这样做:Ian Bamforth的回答.
<TextBlock Text="{Binding MyText, FallbackValue=None}"/>
从这个问题的例子中进行适应。
对我来说,这个方法有效 - 设计师中显示了文本“None”:
<TextBlock>
<TextBlock.Text>
<Binding ElementName="root" Path="blah" FallbackValue="None" />
</TextBlock.Text>
</TextBlock>
使用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);
}
}
}
Binding
一样使用它,只需添加DesignValue
属性即可:<TextBlock Text="{my:BindingEx Name, DesignValue=John Doe}" />
BindingEx
并没有Binding
所有的属性,但如果需要,你可以很容易地添加它们。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”。