Есть ли способ логически группировать элементы управления в WPF

Здесь сценарий

У меня есть сетка с некоторыми элементами управления TextBlock, каждая из которых находится в отдельной ячейке в сетке. Логически я хочу, чтобы можно было установить видимость на них, привязанных к свойству в моей модели ViewModel. Но поскольку они находятся в отдельной ячейке в сетке, я должен установить каждое свойство видимости TextBlock.

Есть ли способ иметь визуальную группу, на которой я могу установить общие свойства своих детей? Или мне снится?

Ответ 1

Нет визуальной группы, которая сделала бы это возможным.

Настройка свойств видимости, напрямую или в общем стиле, разделяемом всеми текстовыми блоками, является, пожалуй, самым простым решением.

Ответ 2

Другим вариантом является привязка свойства видимости каждого элемента в вашей группе элементов к одному элементу, таким образом, в вашем коде позади вас только когда-либо нужно установить видимость одного элемента.

Ответ 3

Надеюсь, вы определили все элементы пользовательского интерфейса вашей ячейки внутри DataTemplate. Вы можете сделать небольшой трюк на уровне ViewModel, чтобы достичь того, что вы ищете.

  • Имеет класс Singleton в ViewModel, который должен иметь видимость или эквивалентное свойство, которое вы хотите привязать к каждому текстовому блоку.
  • Класс Singleton должен реализовать INotifypropertyChanged, чтобы получить уведомление об изменении в пользовательском интерфейсе
  • Привязать свойство Singleton в XAML и управлять этим свойством из любого места вашего приложения.

    < TextBlock Visibility = "{Binding Source = {x: Статический локальный: 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 в любом месте вашего кода за

Ответ 4

Возможно, вы сможете создать настраиваемый элемент управления, который перенаправляет все свои методы добавления/удаления детей в свой собственный родитель, сохраняя при этом запись своего содержимого, чтобы он мог применять свои собственные стили свойств. Было бы сложно.

Ответ 5

Если возможно, я по большей части размещаю их в GroupBox и устанавливаю для группового поля BorderThickness значение 0. Таким образом, все элементы управления сгруппированы, вы не видите, что это групповой пакет, и вы можете установить видимость с одним свойством.

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