MVVM - скрытие элемента управления, когда связанное свойство отсутствует - PullRequest
15 голосов
/ 27 марта 2012

Мне было интересно, можно ли скрыть элемент управления в представлении, если свойство, к которому привязан элемент управления, не существует в модели представления.Например, если у меня есть следующее:

<CheckBox Content="Quote"
          IsChecked="{Binding Path=IsQuoted}" />

Могу ли я обнаружить в XAML, что свойство IsQuoted не существует в модели представления, и просто скрыть элемент управления в этом экземпляре.

По сути, я создаю диалоговое окно мастера, которое перемещается по коллекции моделей представлений, отображая связанные представления для каждой из них.Для некоторых моделей представлений в коллекции будет присутствовать свойство «IsQuoted», а для некоторых нет.

Я бы хотел установить флажок вне этих представлений, который отображается, когда текущая модель представления имеетсвойство, и скрывается, когда модель представления не имеет.Все модели представлений получены из общего базового класса, но я бы не стал загромождать базу, добавив свойство «ShowQuoted» и т. Д.

Мысли?И, спасибо заранее ...

1 Ответ

38 голосов
/ 27 марта 2012

Обработайте случай, когда это значение присутствует, используя конвертер, который всегда возвращает Visibility.Visible.Обработайте случай, когда значение отсутствует, указав запасное значение.Когда свойство отсутствует, привязка завершается неудачно и получает запасное значение.

<Page.DataContext>
    <Samples:OptionalPropertyViewModel/>
</Page.DataContext>
<Grid>
    <Grid.Resources>
        <Samples:AlwaysVisibleConverter x:Key="AlwaysVisibleConverter" />
    </Grid.Resources>
    <CheckBox 
        Content="Is quoted" 
        IsChecked="{Binding IsQuoted}"
        Visibility="{Binding IsQuoted, 
                     Converter={StaticResource AlwaysVisibleConverter}, 
                     FallbackValue=Collapsed}"
        />
</Grid>

public class OptionalPropertyViewModel
{
    public bool IsQuoted { get; set; }
}

public class AlwaysVisibleConverter : IValueConverter
{
    #region Implementation of IValueConverter

    public object Convert(object value, 
                          Type targetType, object parameter, CultureInfo culture)
    {
        return Visibility.Visible;
    }

    public object ConvertBack(object value, Type targetType, 
                              object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }

    #endregion
}
...