Использовать значение по умолчанию, если привязка не может быть оценена из-за нулевого значения
существует способ присвоить специальное значение, когда привязка не может быть оценена из-за значения null в свойстве путь?
Например, если у меня есть свойство Имя в классе Клиент и привязка вроде этого:
{Binding CurrentCustomer.Name}
Когда CurrentCustomer имеет значение null, я бы хотел, чтобы привязка создавала строку "---".
"TargetNullValue" и "FallbackValue", похоже, не делают трюка.
Заранее благодарим за помощь.
ИЗМЕНИТЬ:
На самом деле то, что я пытаюсь сделать, заключается в замене нового исходного значения вместо true, когда оно недоступно.
Реальный сценарий следующий:
значение 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, то есть обертывание в другом элементе, отлично работает.
Ответы
Ответ 1
Вы можете использовать PriorityBinding:
<TextBlock>
<TextBlock.Text>
<PriorityBinding>
<Binding Path="CurrentCustomer.Name" />
<Binding Source="---" />
</PriorityBinding>
</TextBlock.Text>
</TextBlock>
Хорошо, для Silverlight, вероятно, проще обернуть элемент в оболочку (например, Border). Затем у вас есть 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>
Ответ 2
Привет, TargetNullValue и FallbackValue. Возможно, версия .NET, которую вы используете, неверна.
Требуется .NET Framework 3.5 SP1.TargetNullValue и FallbackValue - новое дополнение к классу Binding
Ответ 3
если вы используете .NET framework 3.5 или выше, вы можете использовать targetnullValue
В этом примере, если вы создали свойство зависимостей, называемое BackgroundProperty, вы можете использовать targetNullvalue в объявлении привязки.
В этом случае я передаю цвет из ResourceDictionary.
<Style x:Key="LabelAxisNameStyle" TargetType="{x:Type Label}">
<Setter Property="Background">
<Setter.Value>
<Binding Path="BackgroundProperty" TargetNullValue="{StaticResource LabelTitleBrush}"/>
</Setter.Value>
</Setter>
</Style>