在WPF中是否有一种逻辑分组控件的方法?

15

这是情景:

我有一个包含一些TextBlock控件的网格(Grid),每个控件都在网格中单独的单元格中。逻辑上,我希望能够将它们的可见性(Viability)绑定到ViewModel中的属性。但是由于它们在网格中的单独单元格中,我必须设置每个TextBlock的可见性属性。

是否有一种非可视化组(Group)的方法,可以设置其子项的公共属性?或者说我是在做梦吗?


1
所有的TextBlock都是在XAML中创建还是在代码后台中创建的?如果是后者,那么您可以保留它们的列表并进行迭代。 - StayOnTarget
6个回答

13

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

直接设置可见性属性,或者在所有TextBlocks共享的公共样式中设置,可能是最简单的解决方案。


1
你能详细说明一下吗?我希望将组的可见性绑定到一个附加属性上。 - Shimmy Weitzhandler

6

另一个选项是将一组项目中每个项目的可见性属性绑定到一个单独的项目上,这样在你的代码后台中,你只需要设置一个项目的可见性。


2
我希望您已经在DataTemplate中定义了所有的单元格UI元素。您可以在ViewModel级别使用一个小技巧来实现您想要的效果。
  1. 在ViewModel中创建一个Singleton类,该类应具有您想要绑定到每个TextBlock的Visibility或等效属性。
  2. Singleton类应该实现INotifypropertyChanged以获取UI的更改通知。
  3. 在XAML中绑定Singleton属性,并从应用程序的任何地方控制此属性。

    < TextBlock Visibility="{Binding Source={x:Static local:Singleton.Instance},Path=Visibility}"

并且可以实现一个简单的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


2

如果可能的话,我通常会将它们放入一个GroupBox中,并将GroupBox的BorderThickness设置为0。这样所有的控件都被分组在一起,你看不出来它是一个GroupBox,而且你可以使用一个属性来设置可见性。

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


0

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


0

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

将所有相关控件放置在一个新的网格中,该网格位于现有网格内;跨越适当的单元格并在其自身结构中复制它们。然后,您可以更改新网格的可见性以及其中的控件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接