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)
改编这个问题的一个例子.
这适用于我 - 设计师显示"无"字样:
<TextBlock>
<TextBlock.Text>
<Binding ElementName="root" Path="blah" FallbackValue="None" />
</TextBlock.Text>
</TextBlock>
Run Code Online (Sandbox Code Playgroud)
希望有所帮助
使用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,但您可以在必要时轻松添加它们。