Страницы

Поиск по вопросам

вторник, 7 мая 2019 г.

Установка единого значения свойства объектам на форме WPF

На форме WPF есть несколько TextBlock. Как программно по нажатию кнопки установить у них всех к примеру свойство Visible в false?


Ответ

Если вы пользуетесь MVVM (а чем ещё?), у вас не должно быть желания обработать все текстбоксы на странице — вы должны думать не в терминах контролов, а в терминах показываемых на странице сущностей. Тем более что визуальное представление любого из объектов может поменяться, TextBox может поменяться на другой контрол, а вам скорее всего хочется отключить видимость этого элемента, какого бы типа он ни был.
Поэтому правильное решение — выставить в VM свойство наподобие IsVisible, и привязываться к нему. По команде из UI переключать на уровне бизнес-логики свойства IsVisible у нужных VM-объектов, и дать UI автоматически подхватить эти изменения.

Альтернативное, более техническое решение наподобие изложенного в соседнем ответе: binding к свойству + общий стиль. (Я бы всё же советовал управлять на уровне VM.)
Пример:
True Edit mode

Если нужно для некоторых TextBox'ов включать, а для других выключать видимость по «общему» сигналу, придётся создать свой конвертер. Это совсем не сложно:
public class BooleanToVisibilityInvertedConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { return ((bool)value) ? Visibility.Collapsed : Visibility.Visible; }
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { return object.Equals(value, Visibility.Collapsed); } }
Ну и теперь можно подключить к коду. Один из многих способов:
True Edit mode
Или можно уложить это в два стиля, чтобы код был проще.

Комментариев нет:

Отправить комментарий