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 - 当绑定属性不存在时隐藏控件的主要内容,如果未能解决你的问题,请参考以下文章