【问题标题】:Set the Visibility of Data Grid in WPF在 WPF 中设置数据网格的可见性
【发布时间】:2013-08-10 23:37:27
【问题描述】:

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

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

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

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

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

请提供您的想法。谢谢

【问题讨论】:

    标签: wpf mvvm wpfdatagrid


    【解决方案1】:

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

    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}}"
    

    【讨论】:

      【解决方案2】:

      您可以使用BooleanToVisibilityConvertertrue 转换为System.Windows.Visibility.Visible 并将false 转换为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}}"/>
      

      【讨论】:

      • 对于像我这样的其他菜鸟,资源部分位于您的 app.xaml 文件中,而不是您的 View xaml 中。
      【解决方案3】:

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

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

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

      可见显示元素。

      因此,为了从 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();
          }
      }
      

      【讨论】:

      • 我们可以在我们的视图模型类中设置可见性属性,也可以像 private Visibility isPrGridVisible = Visibility.Collapsed;
      猜你喜欢
      • 2011-06-14
      • 1970-01-01
      • 2018-12-20
      • 2015-04-18
      • 2014-04-07
      • 2014-12-19
      • 2011-10-13
      • 1970-01-01
      • 2018-10-13
      相关资源
      最近更新 更多