1

在我的应用程序中,我在一个 xaml 文件中有 3 个数据网格。根据用户选择,我想显示一个网格并隐藏其他网格。

在我的视图模型类中,我对每个网格都有布尔属性,并根据选择将其设置为 true 或 false。但所有网格都是可见的。

    <DataGrid  Visibility="{Binding Path=IsGridVisible}" >

在我的视图模型中,我正在设置 IsGridVisible 值

public bool IsCapexGridVisible
    {
        get { return isCapexGridVisible; }
        set { isCapexGridVisible = value; RaisePropertyChangedEvent("IsCapexGridVisible"); }
    }

请提供您的想法。谢谢

4

3 回答 3

10

您可以使用BooleanToVisibilityConverter转换trueSystem.Windows.Visibility.Visible和。falseSystem.Windows.Visibility.Collapsed

因此,您可以使用这个预构建的转换器,并且必须将其添加到资源中。

<BooleanToVisibilityConverter x:Key="BoolToVis"/>

bool在 ViewModel 中创建类型的属性

    bool _dgVisibility;
    public bool DataGridVisibility
    {
        get {  return _dgVisibility;  }
        set
        {
            _dgVisibility = value;
            OnPropertyChanged("DataGridVisibility");
        }
    }

你可以像下面这样使用它

<DataGrid Visibility="{Binding Path=DataGridVisibility, Converter={StaticResource BoolToVis}}"/>
于 2013-08-09T05:00:20.213 回答
2

UIElement 上的可见性属性不是布尔值。它是一个具有三个值的枚举:

Collapsed 不显示元素,也不要在布局中为其保留空间。

隐藏 不显示元素,但在布局中为元素保留空间。

可见显示元素。

因此,为了从 ViewModel 正确设置它,您应该: - 使您的属性类型为 Visibility(不是世界上最好的解决方案) - 使用转换器进行绑定,这将完成将布尔值转换为可见性的技巧

  public class BooleanToCollapsedConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (targetType == typeof(Visibility) && value is bool)
        {
            return (bool)value ? Visibility.Visible : Visibility.Collapsed;
        }
        throw new FormatException();
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
于 2013-08-09T04:24:10.250 回答
0

具有可见性定制的附加转换器变体

using System;
using System.Globalization;
using System.Windows;
using System.Windows.Data;
using System.Windows.Markup;


[MarkupExtensionReturnType(typeof(IValueConverter))]
public class BoolToVisibilityConverter : MarkupExtension, IValueConverter
{
    [ConstructorArgument("TrueValue")]
    public Visibility TrueValue { get; set; }

    [ConstructorArgument("FalseValue")]
    public Visibility FalseValue { get; set; }

    [ConstructorArgument("NullValue")]
    public Visibility NullValue { get; set; }

    public BoolToVisibilityConverter()
    {
        TrueValue = Visibility.Visible;
        FalseValue = Visibility.Collapsed;
        NullValue = Visibility.Collapsed;
    }

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value == null) return NullValue;

        if (value is not bool boolValue)
            return null;

        return boolValue ? TrueValue : FalseValue;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (Equals(value, TrueValue))
            return true;
        if (Equals(value, FalseValue))
            return false;
        return null;
    }

    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        return this;
    }
}

用法:

<someControl ...
             xmlns:converters="clr-namespace:ExampleNamespace.Converters;assembly=ExampleAssembly"
             ...
             >

...

Visibility="{Binding IsSearchInProgress, 
             Mode=OneWay, 
             Converter={converters:BoolToVisibilityConverter}}"

Visibility="{Binding IsSearchInProgress, 
             Mode=OneWay, 
             Converter={converters:BoolToVisibilityConverter TrueValue=Collapsed, FalseValue=Visible}}"
于 2021-09-15T20:28:27.840 回答