代码之家  ›  专栏  ›  技术社区  ›  Michal Ciechan

MVVM绑定到属性==Null

  •  1
  • Michal Ciechan  · 技术社区  · 16 年前

    以下是我的ViewModel:

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

    以下是贸易类别:

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

    这是my View.xaml的一部分

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

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

    2 回复  |  直到 16 年前
        1
  •  3
  •   Adam Robinson    16 年前

    而不是使用 BooleanToVisibilityConverter

    像这样:

    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 你的绑定,因为你不能做一个来回转换。

        2
  •  3
  •   Agies    16 年前

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