【问题标题】:How to bind int to Visibility in WPF?如何将 int 绑定到 WPF 中的可见性?
【发布时间】:2017-04-16 06:24:25
【问题描述】:

我有具有 1 .. 7 值的 BudgetControlType 属性

if(BudgetControlType ==1)
 dataComboBox1.Visibility=Visibility.Visiblile;
 dataComboBox2 to dataComboBox7 =Visibility.Hidden;

if(BudgetControlType ==2)
 dataComboBox1.Visibility=Visibility.Visiblile;
 dataComboBox2.Visibility=Visibility.Visiblile;
 dataComboBox3 to dataComboBox7 =Visibility.Hidden;

等等……

如何在 xaml 中做到这一点?

【问题讨论】:

    标签: wpf xaml data-binding


    【解决方案1】:

    您可以使用 1,2,4,8,... 并将其转换为可见性

    例如,如果您的 int 编号为 6 (2+4),则带有参数 2 的控制和带有参数 4 的控制是可见的!

     public class IntToVisibilityConverter:IValueConverter
        {
            private int val;
            public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
            {
                int intParam = (int)parameter;
                val = (int)value;
    
                return ((intParam & val) != 0) ? Visibility.Visible : Visibility.Collapsed;
            }
    
            public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
            {
                return null;
            }
        }
    

    在 xaml 中:

    <ComboBox Visibility="{Binding Path=MyEnum,UpdateSourceTrigger=PropertyChanged, Converter={StaticResource IntToVisibilityConverter}, ConverterParameter=1}"/>
    
    <ComboBox Visibility="{Binding Path=MyEnum,UpdateSourceTrigger=PropertyChanged, Converter={StaticResource IntToVisibilityConverter}, ConverterParameter=2}"/>
    
    <ComboBox Visibility="{Binding Path=MyEnum,UpdateSourceTrigger=PropertyChanged, Converter={StaticResource IntToVisibilityConverter}, ConverterParameter=4}"/>
    

    【讨论】:

      【解决方案2】:

      我想说的最好方法是使用 ViewModel 上的属性,并绑定到它们。

      示例(您必须稍微按摩一下,但从这里开始相当简单):

      public Visibility dtcb1 { get; set; }
      // all the rest till 7
      
      // Somewhere in your logit / constructor :
      dtcb1 = BudgetControlType == 1 ? Visible : Hidden;
      // and so on
      

      并且在您的 xaml 上,您会将您的可见性绑定到 dtcb1 您可以将属性设为布尔值,也可以使用布尔值到可见性转换器(例如按照this answer,或者只是自己google)

      【讨论】:

      • 我不想在 ViewModel 中使用 System.Windows 命名空间
      • 为什么不呢?除此之外,我所说的和 mehdi 写下的(这就是我所说的,用勺子喂)应该这样做......
      【解决方案3】:

      这是我过去使用 WPFConverters 使用的另一种方法。

      <TabItem.Visibility>
          <Binding Path="SomeObservableCollection.Count">
              <Binding.Converter>
                  <converters:ConverterGroup>
                      <converters:ExpressionConverter Expression="{}{0} &gt; 0" />
                      <BooleanToVisibilityConverter />
                  </converters:ConverterGroup>
              </Binding.Converter>
          </Binding>
      </TabItem.Visibility>
      

      ConvertGroup 允许多个转换器按顺序运行。

      ExpressionConverter 允许您定义任意表达式。在我的情况下,如果集合计数大于零,我希望 TabItem 可见。在 xaml 中定义意味着转义字符和有点尴尬的语法,但它工作得很好!

      BooleanToVisibilityConverter 将表达式的布尔结果转换为我们想要的可见性。

      对于 Elham,BudgetControlType 可以绑定到,只要它实现了 INotifyPropertyChanged。一个 equals 表达式是这样完成的(如果绑定值等于 7,我将返回 true):

      <converters:ExpressionConverter Expression="{}{0} == 7" />
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-05-23
        • 2018-12-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-01
        • 2016-06-11
        • 2014-03-31
        相关资源
        最近更新 更多