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

问题描述 投票:0回答:2

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

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

我可以在 XAML 中检测到视图模型上不存在 IsQuoted 属性,并简单地隐藏该实例中的控件吗?

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

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

想法?并且,预先感谢...

wpf xaml binding mvvm visibility
2个回答
42
投票

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

0
投票

我修改了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}"
    />
© www.soinside.com 2019 - 2024. All rights reserved.