Craig Shearer
Craig Shearer

Reputation: 14521

Is there a way to logically group controls in WPF

Here's the scenario

I have a Grid with some TextBlock controls, each in a separate cell in the grid. Logically I want to be able to set the Visibility on them bound to a property in my ViewModel. But since they're each in a separate cell in the grid, I have to set each TextBlock's Visibility property.

Is there a way of having a non-visual group on which I can set common properties of its children? Or am I dreaming?

Upvotes: 16

Views: 22627

Answers (6)

Arkady Bron
Arkady Bron

Reputation: 1

I realise that this a very ancient question, but there will no doubt people finding this thread after searching for something related. Therefore I offer the following very simple solution:

Place all of the controls in question into a new grid that sits within the existing grid; spans the appropriate cells and replicates them within it's own structure. Then you can change the visibility of the new grid, and with it the controls inside.

Upvotes: 0

Jobi Joy
Jobi Joy

Reputation: 50038

I hope you have defined all of your cell UI elements inside a DataTemplate. You can do a small trick at the ViewModel level to achieve what you are looking for.

  1. Have Singleton class at the ViewModel, which should have the Visibility or an equivalent property which you wanted to bind to every TextBlock.
  2. The Singleton class should implement INotifypropertyChanged to get the change notification to the UI
  3. Bind the Singleton property in the XAML and control this property from anywhere in your application.

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

And a simple Singleton class can be implemented as

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

Now you can control Singleton.Instance.Visibility = Visibility.Collapsed anywhere from your code behind

Upvotes: 2

PitAttack76
PitAttack76

Reputation: 2220

If possible I mostly place them in a GroupBox and set the groupbox BorderThickness to 0. That way all controls are grouped, you don't see that it's a groupbox and you can set the visibility with one property..

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

Upvotes: 2

Patrick
Patrick

Reputation: 1827

It may be possible to make a custom control that redirects all its add/remove children methods to its own parent, while still keeping a record of its contents so it can apply its own property styles. Would be tricky though.

Upvotes: 0

Hamish
Hamish

Reputation:

Another option is to bind the visibility property of each item in your group of items to one single item, that way in your code behind you are only ever having to set the visibility of one item.

Upvotes: 6

Ed Ball
Ed Ball

Reputation: 2069

There is no non-visual group that would make this possible.

Setting the Visibility properties, directly or in a common Style shared by all of the TextBlocks, is probably the simplest solution.

Upvotes: 14

Related Questions