Используйте значение по умолчанию, когда привязка не может быть оценена из-за нулевого значения - PullRequest
16 голосов
/ 23 ноября 2010

есть способ присвоить специальное значение , когда привязка не может быть оценена из-за нулевого значения в пути свойства ?

Например, если у меня есть свойство Имя в классе Клиент и такая привязка:

{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 ]

20 голосов
/ 23 ноября 2010

Вы можете использовать PriorityBinding :

<TextBlock>
    <TextBlock.Text>
        <PriorityBinding>
            <Binding Path="CurrentCustomer.Name" />
            <Binding Source="---" />
        </PriorityBinding>
    </TextBlock.Text>
</TextBlock>

Хорошо, для Silverlight, вероятно, легче обернуть элемент в оболочку (например, Border).Затем у вас есть IValueConverter для преобразования нуля в 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>
13 голосов
/ 23 ноября 2010

Эй, TargetNullValue и FallbackValue работает.Возможно, версия .NET, которую вы используете, неверна.

Требуется .NET Framework 3.5 SP1 .TargetNullValue и FallbackValue - это новое дополнение к классу связывания

0 голосов
/ 02 июля 2016

если вы используете .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>            
...