如果由于属性中的空值而无法评估绑定,则可以指定特殊值路径?
例如,如果我在类客户中有一个属性名称,并且有这样的绑定:
{Binding CurrentCustomer.Name}
当 CurrentCustomer 为null时,我希望绑定生成字符串“---”。
“TargetNullValue”和“FallbackValue”似乎无法解决问题。
提前感谢您的帮助。
编辑:
事实上,我想要做的就是用一个新的源值代替真实的,当它不可用时。 真实情况如下:
bool值用于确定控件的可见性,但是当无法获得此值时,我想将其替换为“false”。
这是一个完全模仿我真实用例的插图:
MainPage.xaml.cs:
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
namespace TestSilverlightBindingDefaultValue
{
public class BoolToVisibilityConverter : IValueConverter
{
#region IValueConverter Members
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return (bool)value ? Visibility.Visible : Visibility.Collapsed;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
#endregion
}
public class Customer
{
public bool HasACar
{
get;
set;
}
}
public partial class MainPage : UserControl
{
public static readonly DependencyProperty CurrentCustomerProperty =
DependencyProperty.Register("CurrentCustomer", typeof(Customer), typeof(MainPage), null);
public Customer CurrentCustomer
{
get { return this.GetValue(CurrentCustomerProperty) as Customer; }
set { this.SetValue(CurrentCustomerProperty, value); }
}
public MainPage()
{
InitializeComponent();
this.CurrentCustomer = null;
this.DataContext = this;
}
}
}
MainPage.xaml:
<UserControl x:Class="TestSilverlightBindingDefaultValue.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:local="clr-namespace:TestSilverlightBindingDefaultValue"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="400">
<UserControl.Resources>
<local:BoolToVisibilityConverter x:Key="boolToVisibilityConverter" />
</UserControl.Resources>
<StackPanel x:Name="LayoutRoot" Background="White">
<TextBlock Text="You have a car" Visibility="{Binding CurrentCustomer.HasACar,Converter={StaticResource boolToVisibilityConverter}}" />
</StackPanel>
FallbackValue 不是解决方案,因为它只会更改生成的值而不会更改源值。
Abe Heidebrecht 为 WPF 提供了 PriorityBinding 的完美解决方案,但 Silverlight 中不存在。
最终编辑: Abe Heidebrecht 的第二个解决方案,即包装在另一个元素中,完美地运作。
答案 0 :(得分:20)
您可以使用PriorityBinding:
<TextBlock>
<TextBlock.Text>
<PriorityBinding>
<Binding Path="CurrentCustomer.Name" />
<Binding Source="---" />
</PriorityBinding>
</TextBlock.Text>
</TextBlock>
好的,对于Silverlight来说,将元素包装在包装器(如边框)中可能更容易。然后,您有IValueConverter
将null转换为Visibility.Collapsed
,将其他任何内容转换为Visibility.Visible
:
public class NullToVisibilityConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return value != null ? Visibility.Visible : Visibility.Collapsed;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
并像这样使用它:
<Border Visibility="{Binding CurrentCustomer, Converter={StaticResource NullToVisibilityConverter}}">
<TextBlock Text="You have a car" Visibility="{Binding CurrentCustomer.HasACar,Converter={StaticResource boolToVisibilityConverter}}" />
</Border>
答案 1 :(得分:13)
嘿TargetNullValue和FallbackValue有效。可能是您使用的.NET版本错误。
它需要.NET Framework 3.5 SP1 .TargetNullValue和FallbackValue是Binding类的新增功能
答案 2 :(得分:0)
如果您使用.NET framework 3.5或更高版本,则可以使用targetnullValue 在此示例中,如果已创建名为BackgroundProperty的依赖项属性,则可以在绑定声明中使用targetNullvalue。 在这种情况下,我从ResourcesDictionary传递颜色。
<Style x:Key="LabelAxisNameStyle" TargetType="{x:Type Label}">
<Setter Property="Background">
<Setter.Value>
<Binding Path="BackgroundProperty" TargetNullValue="{StaticResource LabelTitleBrush}"/>
</Setter.Value>
</Setter>
</Style>