MVVM - 在绑定属性不存在时隐藏控件

时间:2012-03-27 16:36:25

标签: wpf xaml binding mvvm visibility

我想知道如果视图模型中不存在控件绑定到的属性,是否可以隐藏视图上的控件。例如,如果我有以下内容:

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

我可以在XAML中检测到视图模型上不存在IsQuoted属性,只需隐藏该实例中的控件。

我实际上是在创建一个向导对话框,该对话框在一组视图模型中移动,显示每个视图模型的相关视图。对于集合中的某些视图模型,将出现“IsQuoted”属性,而有些则不存在。

我希望在当前视图模型具有属性时显示这些视图之外的复选框,并在视图模型不显示时隐藏。所有的视图模型都是从一个公共基类派生出来的,但我宁愿不通过添加“ShowQuoted”属性等来使基础混乱。

思考?并且,提前谢谢......

1 个答案:

答案 0 :(得分:38)

使用始终返回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
}