gpt4 book ai didi

wpf - 当由于空值而无法评估绑定(bind)时,使用默认值

转载 作者:行者123 更新时间:2023-12-03 01:44:34 26 4
gpt4 key购买 nike

当由于属性中的空值而无法评估绑定(bind)时,有没有办法分配特殊值路径

例如,如果我在类 Customer 中有一个属性 Name 以及如下所示的绑定(bind):

{Binding CurrentCustomer.Name}

CurrentCustomer为空时,我希望绑定(bind)生成字符串“---”。

“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通过PriorityBindingWPF提供了完美的解决方案,但它在Silverlight中并不存在。

最终编辑:Abe Heidebrecht 的第二个解决方案,即包装在另一个元素中,效果很好。

最佳答案

您可以使用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>

关于wpf - 当由于空值而无法评估绑定(bind)时,使用默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4259315/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com