我想知道如果视图模型中不存在控件绑定的属性,是否可以隐藏视图上的控件。例如,如果我有以下内容:
<CheckBox Content="Quote"
IsChecked="{Binding Path=IsQuoted}" />
我可以在 XAML 中检测到视图模型上不存在 IsQuoted 属性,并简单地隐藏该实例中的控件吗?
我本质上是创建一个向导对话框,该对话框在视图模型集合中移动,显示每个视图模型的关联视图。对于集合中的某些视图模型,将存在“IsQuoted”属性,而对于某些视图模型则不存在。
我希望在这些视图之外有一个复选框,当当前视图模型具有该属性时显示,当视图模型不具有该属性时隐藏。所有视图模型都派生自一个公共基类,但我不想通过添加“ShowQuoted”属性等来弄乱基类。
想法?并且,预先感谢...
使用始终返回 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
}
我修改了Phil的答案以使TargetNullValue起作用:
public class AlwaysVisibleConverter : IValueConverter
{
public object? Convert(object? value, Type targetType,
object parameter, CultureInfo culture)
{
if (value is null)
{
// Makes TargetNullValue work.
// Apparently TargetNullValue doesn't look at the target directly, but through this converter.
return null;
}
return Visibility.Visible;
}
public object ConvertBack(object value, Type targetType,
object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
并且:
<CheckBox
Content="Is quoted"
IsChecked="{Binding IsQuoted}"
Visibility="{Binding IsQuoted,
Converter={StaticResource AlwaysVisibleConverter},
FallbackValue=Collapsed
TargetNullValue=Collapsed}"
/>