在WPF中设置数据网格的可见性

时间:2013-08-09 04:07:56

标签: wpf mvvm wpfdatagrid

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

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

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

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

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

请提供您的想法。感谢

2 个答案:

答案 0 :(得分:7)

您可以BooleanToVisibilityConvertertrue转换为System.Windows.Visibility.Visiblefalse转换为System.Windows.Visibility.Collapsed

因此,您可以获得此预制转换器的帮助,并且必须将其添加到资源中。

<BooleanToVisibilityConverter x:Key="BoolToVis"/>

在ViewModel中创建bool类型的属性

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

您可以按以下方式使用

<DataGrid Visibility="{Binding Path=DataGridVisibility, Converter={StaticResource BoolToVis}}"/>

答案 1 :(得分:2)

UIElement上的Visibility属性不是布尔值。这是一个有三个值的枚举:

折叠不显示元素,也不在布局中为其预留空间。

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

可见显示元素。

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

的技巧
  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();
    }
}
相关问题