Есть ли способ логически сгруппировать элементы управления в WPF - PullRequest
12 голосов
/ 03 декабря 2008

Вот сценарий

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

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

Ответы [ 5 ]

11 голосов
/ 03 декабря 2008

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

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

4 голосов
/ 23 марта 2009

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

2 голосов
/ 03 декабря 2008

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

  1. Имейте класс Singleton в ViewModel, который должен иметь видимость или эквивалентное свойство, которое вы хотите связать с каждым TextBlock.
  2. Класс Singleton должен реализовывать INotifypropertyChanged, чтобы получать уведомление об изменении пользовательского интерфейса
  3. Свяжите свойство Singleton в 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.Collased в любом месте от вашего кода позади

0 голосов
/ 16 апреля 2013

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

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

0 голосов
/ 26 января 2013

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...