【问题标题】:Is there a way to logically group controls in WPF有没有办法在 WPF 中对控件进行逻辑分组
【发布时间】:2022-01-17 19:06:33
【问题描述】:

这是场景

我有一个带有一些 TextBlock 控件的 Grid,每个控件都位于网格中的一个单独的单元格中。从逻辑上讲,我希望能够将它们的可见性设置为绑定到我的 ViewModel 中的一个属性。但由于它们分别位于网格中的单独单元格中,因此我必须设置每个 TextBlock 的 Visibility 属性。

有没有办法让我可以在其上设置其子项的公共属性的非可视组?还是我在做梦?

【问题讨论】:

  • 所有的 TextBlocks 是在 XAML 中还是在代码隐藏中创建的?如果是后者,那么您可以保留它们的列表并遍历它。

标签: wpf


【解决方案1】:

没有非视觉组可以使这成为可能。

直接或以所有 TextBlock 共享的通用样式设置 Visibility 属性可能是最简单的解决方案。

【讨论】:

  • 您能详细说明一下吗?我希望将组的可见性绑定到附加属性。
【解决方案2】:

另一种选择是将项目组中每个项目的可见性属性绑定到单个项目,这样在您后面的代码中只需设置一个项目的可见性。

【讨论】:

    【解决方案3】:

    我希望您已经在 DataTemplate 中定义了所有单元格 UI 元素。您可以在 ViewModel 级别做一个小技巧来实现您正在寻找的东西。

    1. 在 ViewModel 上有 Singleton 类,它应该具有要绑定到每个 TextBlock 的 Visibility 或等效属性。
    2. Singleton 类应实现 INotifypropertyChanged 以将更改通知发送到 UI
    3. 在 XAML 中绑定 Singleton 属性,并从应用程序中的任何位置控制此属性。

    一个简单的单例类可以实现为

    public class Singleton :INotifyPropertyChanged
    {
        private Singleton() { }
        public static Singleton Instance
        {
            get
            {
                if (instance == null){ instance = new Singleton(); }
                return instance;
            }
        }
        private Visibility _visibility;
        public Visibility Visibility
        {
            get { return _visibility; }
            set 
            { 
                _visibility = value; 
                PropertyChanged( this, new PropertyChangedEventArgs("Visibility") );
            }
        }
        public event PropertyChangedEventHandler PropertyChanged;
        private static Singleton instance;
     }
    

    现在您可以从后面的代码中的任何位置控制 Singleton.Instance.Visibility = Visibility.Collapsed

    【讨论】:

      【解决方案4】:

      如果可能的话,我主要将它们放在一个 GroupBox 中并将 groupbox BorderThickness 设置为 0。这样所有控件都被分组,您不会看到它是一个 groupbox,您可以使用一个属性设置可见性..

        <Style TargetType="{x:Type GroupBox}"
           x:Key="HiddenGroupBox">
      <Setter Property="BorderThickness"
              Value="0" />
      

      【讨论】:

        【解决方案5】:

        可以创建一个自定义控件,将其所有添加/删除子方法重定向到其自己的父级,同时仍保留其内容的记录,以便它可以应用自己的属性样式。不过会很棘手。

        【讨论】:

          【解决方案6】:

          我意识到这是一个非常古老的问题,但毫无疑问,人们会在搜索相关内容后找到该主题。因此,我提供以下非常简单的解决方案:

          将所有有问题的控件放入现有网格中的新网格中;跨越适当的单元格并在其自己的结构中复制它们。然后您可以更改新网格的可见性,以及里面的控件。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-11-15
            • 2019-03-04
            • 2015-11-29
            • 1970-01-01
            • 2011-02-26
            • 2021-03-07
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多