由于null值而无法计算绑定时,请使用默认值

时间:2010-11-23 18:11:54

标签: wpf silverlight data-binding null

如果由于属性中的空值而无法评估绑定,则可以指定特殊值路径

例如,如果我在类客户中有一个属性名称,并且有这样的绑定:

{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 的第二个解决方案,即包装在另一个元素中,完美地运作。

3 个答案:

答案 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>