我想知道如果视图模型中不存在控件绑定到的属性,是否可以隐藏视图上的控件。例如,如果我有以下内容:
<CheckBox Content="Quote"
IsChecked="{Binding Path=IsQuoted}" />
我可以在XAML中检测到视图模型上不存在IsQuoted属性,只需隐藏该实例中的控件。
我实际上是在创建一个向导对话框,该对话框在一组视图模型中移动,显示每个视图模型的相关视图。对于集合中的某些视图模型,将出现“IsQuoted”属性,而有些则不存在。
我希望在当前视图模型具有属性时显示这些视图之外的复选框,并在视图模型不显示时隐藏。所有的视图模型都是从一个公共基类派生出来的,但我宁愿不通过添加“ShowQuoted”属性等来使基础混乱。
思考?并且,提前谢谢......
答案 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
}