Подтвердить что ты не робот

MVVM - скрытие элемента управления при отсутствии связанного свойства

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

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

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

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

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

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

4b9b3361

Ответ 1

Обращайтесь к случаю, когда это значение присутствует с помощью конвертера, который всегда возвращает 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
}