2010-06-09 4 views
1

Я хочу показать некоторые элементы, когда свойство не равно null. Каков наилучший способ достижения этого?MVVM Binding to Property == 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; 
    ...... 
} 

Это часть моего вида. xaml

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

Я бы хотел, чтобы этот групповой ящик отображался только в том случае, если Trade.Company не является нулевым (поэтому, когда пользователь выбирает компанию). Нужно ли мне создать собственный конвертер для проверки нулевого значения и возврата правильной видимости или есть ли в .NET?

ответ

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 к вашему связывании, так как вы не сможете сделать преобразование туда-обратно.

+0

Благодаря придумали эту идею, когда я добрался до бита, где я вставил код XAML, и поняли, может сделать пользовательский конвертер, спасибо за код, который очень ценится! –

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>