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

Posted

技术标签:

【中文标题】MVVM - 当绑定属性不存在时隐藏控件【英文标题】:MVVM - hiding a control when bound property is not present 【发布时间】:2012-04-11 05:41:55 【问题描述】:

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

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

我能否在 XAML 中检测到视图模型中不存在 IsQuoted 属性,并简单地隐藏该实例中的控件。

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

我想在这些视图之外有一个复选框,当当前视图模型具有属性时显示,当视图模型没有属性时隐藏。所有的视图模型都派生自一个通用的基类,但我不想通过添加“ShowQuoted”属性等来弄乱基类。

想法?还有,提前谢谢...

【问题讨论】:

【参考方案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

【讨论】:

酷。我已经使用 WPF 四年了,但我从未注意到 FallbackValue 属性(或者我注意到了但当时没有注意 - 很难说)。这可能会派上用场。 如果你想更明确,你可以检查 DependencyProperty.UnsetValue msdn.microsoft.com/en-us/library/… 聪明,@Phil! @OwenJohnson,如果属性不存在,则无法检查 UnsetValue 。 UnsetValue 是存在但没有值的属性的标记值。在这种情况下,某些对象上不存在该属性。

以上是关于MVVM - 当绑定属性不存在时隐藏控件的主要内容,如果未能解决你的问题,请参考以下文章

MVVM中RadioButton等一对多控件的绑定

MVVM中RadioButton等一对多控件的绑定

MVVM中RadioButton等一对多控件的绑定

如何使用 MVVM 模式在 TreeView 中获取选定节点而不使用代码隐藏? [复制]

WPF MVVM阻止Expander控件崩溃

我可以将 WPF ComboBox 控件的可见性绑定到从命令获得的项目的存在/不存在吗? [关闭]