MVVM绑定到属性== Null

时间:2010-06-09 17:06:11

标签: c# wpf data-binding mvvm

我想在属性不为null时显示一些元素。实现这一目标的最佳方式是什么?

以下是我的ViewModel:

class ViewModel : ViewModelBase
{
    public Trade Trade
    {
        get { return _trade; }
        set { SetField(ref _trade, value, () => Trade); }
    } private Trade _trade;
}

ViewModelBase继承INotifyPropertyChanged并包含SetField()

以下是贸易类:

public class Trade : INotifyPropertyChaged
{
    public virtual Company Company
    {
        get { return _company; }
        set { SetField(ref _company, value, () => Company); }
    } private Company _company;
    ......
}

这是我的View.xaml

的一部分
    <GroupBox Visibility="{Binding Path=Trade.Company, 
                           Converter={StaticResource boolToVisConverter}}" />

我希望只有当Trade.Company不为null时才显示此组框(因此当用户选择公司时)。我是否需要创建一个自定义转换器来检查null并返回正确的可见性,还是.NET中有一个?

2 个答案:

答案 0 :(得分:3)

不是使用BooleanToVisibilityConverter,而是需要使用不同的转换器(您必须编写的转换器),如果绑定值为null,则返回适当的可见性值。

这样的事情:

public class NullValueToVisibilityConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, 
                          CultureInfo culture)
    {
        return (value != null ? Visibility.Visible : Visibility.Collapsed);
    }

    public object ConvertBack(object value, Type targetType, object parameter,  
                              CultureInfo culture)
    {
        return null; // this shouldn't ever happen, since 
                     // you'll need to ensure one-way binding
    }
}

您需要将Mode = OneWay添加到绑定中,因为您将无法进行往返转换。

答案 1 :(得分:3)

如果没有转换器,你也可以使用DataTriggers做同样的事情......

<GroupBox DataContext="{Binding Path=Trade.Company}">
    <GroupBox.Style TargetType="GroupBox">
        <Style.Triggers>
            <DataTrigger Binding="{Binding Path=.}" Value="{x:Null}">
                <Setter Property="Visibility" Value="Collapsed"/>
            </DataTrigger>
        </Style.Triggers>
    </GroupBoxStyle>
</GroupBox>