Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.70/40: Рейтинг темы: голосов - 40, средняя оценка - 4.70
Почетный модератор
Эксперт С++
5850 / 2861 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
1

Простой конвертер для преобразования bool в Visibility

12.12.2018, 11:53. Показов 7729. Ответов 6

Author24 — интернет-сервис помощи студентам
Господа, создал тут простой конвертер для отображения интерфейса в зависимости от наличия элементов в комбобоксе.
Например, отобразить параметры сервера, при его выборе в комбобоксе, где сам комбобокс заполняется при первом раскрытии. То есть пока комбобокс ни разу не открывался, настроечки не отображаются вообще.
Причесал и решил выложить, мож кому пригодится в академических целях.

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:Themes="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
        mc:Ignorable="d"
        x:Class="SomeWpfApplication.MainWindow"
        xmlns:local="clr-namespace:SomeWpfApplication">
 
    <Window.Resources>
        <local:BoolToVisibilityConverter x:Key="BTVConverter"/>
    </Window.Resources>
 
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition />
            <RowDefinition />
            <RowDefinition />
        </Grid.RowDefinitions>
        
        <ComboBox Grid.Row="0"
                  x:Name="CB"
                  SelectedIndex="0"
                  IsEnabled="{Binding HasItems, RelativeSource={RelativeSource Self}}"
                  ItemsSource="{Binding SomeItemsList, RelativeSource={RelativeSource AncestorType=Window}}"/>
        <Button Grid.Row="1"
                Content="Hello"
                Visibility="{Binding ElementName=CB, Path=HasItems, Converter={StaticResource BTVConverter}}"/>
        <Button Grid.Row="2" Content="Add items to Combobox" Click="AddItemsMethod_Click"/>
 
    </Grid>
</Window>
Для конвертера важны строки 8, 11 и 28.
Строка 24 не обязательна - она показывает применение свойства HasItems без конвертера.

Суть: в начале отображаются только пустой комбобокс и кнопка, реализующая метод добавления элементов в этот комбобокс.
Как только появляется первый элемент списка, интерфейс отображают еще одну кнопку с надписью Hello.
Простой конвертер для преобразования bool в Visibility


Чуть подробнее про строку 28:
XML
Visibility="{Binding ElementName=CB, Path=HasItems, Converter={StaticResource BTVConverter}}
Visibility - этому свойству присваивается результат работы конвертера.
ElementName=CB, Path=HasItems - свойство HasItems элемента CB передается в конвертер как параметр.
Converter={StaticResource BTVConverter} - который конвертер используется.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
namespace SomeWpfApplication
{
    public partial class MainWindow : Window, INotifyPropertyChanged
    {
        #region Properties
        // Реализация INotifyPropertyChanged
 
        public event PropertyChangedEventHandler PropertyChanged;
        protected void OnPropertyChanged(string name)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(name));
            }
        }
 
        // Список элементов для биндинга комбобокса
        private ObservableCollection<string> someItemsList= new ObservableCollection<string>();
        public ObservableCollection<string> SomeItemsList
        {
            get { return someItemsList; }
            set { someItemsList= value; OnPropertyChanged("SomeItemsList"); }
        }
 
        #endregion
 
        public MainWindow()
        {
            InitializeComponent();
        }
 
        // Добавление элементов в комбобокс
        static int Count = 0;
        private void AddItemsMethod_Click(object sender, RoutedEventArgs e)
        {
            ServersList.Add("Server" + (++Count).ToString());
        }
    }
 
    // Класс конвертора
    class BoolToVisibilityConverter : IValueConverter
    {
        // Прямое конвертирование
        public object Convert(object value, System.Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            Visibility ReturnValue = Visibility.Collapsed;
 
            switch ((bool)value)
            {
                case true:  ReturnValue = Visibility.Visible; break;
                case false: ReturnValue = Visibility.Collapsed; break;
            }
 
            return ReturnValue;
        }
 
        // Обратное
        public object ConvertBack(object value, System.Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            bool ReturnValue = false;
 
            switch ((Visibility)value)
            {
                case Visibility.Visible:    ReturnValue = true; break;
                case Visibility.Collapsed:  ReturnValue = false; break;
                case Visibility.Hidden:     ReturnValue = false; break;
            }
 
            return ReturnValue;
        }
    }
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.12.2018, 11:53
Ответы с готовыми решениями:

Различие Visibility.Hidden и Visibility.Collapsed
Сразу прошу прощения за глупый вопрос,но в интернете сколько не искал,так до конца и не понял В...

Нужен простой конвертер byte[] to Image WPF
Есть бд MSSQL в ней таблица в которой в поле Logo типа Image хранятся изображения формата jpeg(да,...

Посоветуйте конвертер для преобразования Cda в MP3
Накопилась аудиотека на компакт-дисках. Боязно скачивать программы после прочтения тем о вирусах. ...

Простой конвертер из PDF в Word
задался вопросом, а возможно написать простенький конвертер из pdf в word (doc). но всё что я смог...

6
Модератор
Эксперт .NET
15464 / 10710 / 2786
Регистрация: 21.04.2018
Сообщений: 31,531
Записей в блоге: 2
12.12.2018, 13:16 2
SatanaXIII, чего-то я недопонял....
Пара вопросов:
  1. Чем Ваш отличается от стандартного системного?
  2. Вы пишите "свойство HasItems элемента CB передается в конвертер как параметр" , но у Вас параметр в конвертере, вообще, не обрабатывается.... Наверное "предаётся как ЗНАЧЕНИЕ" ? Пример конвертера BooleanToVisibilityConverter с возможностью инвертирования через параметр можно посмотреть здесь Загрузка данных из XML в DataGrid пост #27 - обратную конвертацию не делал. В том случае не было надобности.

Добавлено через 22 минуты
Вот полный код конвертера с возможностью через параметр инвертирования значения и замены Collapsed на Hidden
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
    /// <summary>Конвертер преобразующий bool в Visibility</summary>
    [ValueConversion(typeof(Boolean), typeof(Visibility))]
    public class BooleanToVisibilityConverter : IValueConverter
    {
        /// <summary>Прямая конвертация bool в Visibility</summary>
        /// <param name="value">Значение для конвертации</param>
        /// <param name="targetType">Целевой тип</param>
        /// <param name="parameter">Параметр. Если в нём "not", "no", "false" или "нет", то инвертируем видимость. Если "hidden" или "скрыть", то вместо колапса - скрытие</param>
        /// <param name="culture">Не используется</param>
        /// <returns>Видимость</returns>
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            Visibility ret = Visibility.Visible;
 
            // Если проверяемое значение не null и равно false, то коллапс
            if (value != null && ((value.GetType() == typeof(bool) && (bool)value == false)
                                    || (value.GetType() == typeof(string) && ((string)value).ToLower().Contains("false"))
                                  )
               ) ret = Visibility.Collapsed;
 
            // Если параметр не null, то проверяем его тип
            if (parameter != null)
            {
                Type parType = (parameter.GetType();
                // Если тип параметра bool и он равен false, то инвертируем видимость
                if (parType == typeof(bool) && (bool)parameter == false)
                    if (ret == Visibility.Collapsed)
                        ret = Visibility.Visible;
                    else ret = Visibility.Collapsed;
 
                // Если тип параметра string и он содержит "not", "no", "false" или "нет", то инвертируем видимость
                if (parType == typeof(string)
                    && !string.IsNullOrWhiteSpace("not no false нет".Split().FirstOrDefault(str => ((string)parameter).ToLower().Contains(str))))
                    if (ret == Visibility.Collapsed)
                        ret = Visibility.Visible;
                    else ret = Visibility.Collapsed;
 
                // Если тип параметра Visibility и он равен Hidden, то заменяем Collapsed на Hidden
                if (parType == typeof(Visibility) && (Visibility)parameter == Visibility.Hidden)
                    if (ret == Visibility.Collapsed)
                        ret = Visibility.Hidden;
 
                // Если тип параметра string и он содержит "hidden" или "скрыть", то заменяем Collapsed на Hidden
                if (parType == typeof(string)
                    && !string.IsNullOrWhiteSpace("hidden скрыть".Split().FirstOrDefault(str => ((string)parameter).ToLower().Contains(str))))
                    if (ret == Visibility.Collapsed)
                        ret = Visibility.Hidden;
 
            }
            return ret;
        }
        /// <summary>Обратная конвертация</summary>
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            // Если проверяемое значение null или его тип не Visibility, то выход без конвертации
            if (value == null || !(value is Visibility val))
                return value;
 
            bool ret = val == Visibility.Visible;
 
            // Если параметр не null, то проверяем его тип
            if (parameter != null)
            {
                Type parType = (parameter.GetType();
                // Если тип параметра bool и он равен false, то инвертируем значение
                if (parType == typeof(bool) && (bool)parameter == false)
                    ret = !ret;
 
                // Если тип параметра string и он содержит "not", "no", "false" или "нет", то инвертируем значение
                if (parType == typeof(string)
                    && !string.IsNullOrWhiteSpace("not no false нет".Split().FirstOrDefault(str => ((string)parameter).ToLower().Contains(str))))
                    ret = !ret;
            }
            return ret;
        }
 
    }
1
Почетный модератор
Эксперт С++
5850 / 2861 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
12.12.2018, 13:30  [ТС] 3
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Чем Ваш отличается от стандартного системного?
Это который?
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Наверное "предаётся как ЗНАЧЕНИЕ" ?
Да, именно. Прошу меня извинить.
0
Модератор
Эксперт .NET
15464 / 10710 / 2786
Регистрация: 21.04.2018
Сообщений: 31,531
Записей в блоге: 2
12.12.2018, 13:44 4
Ну есть же стандартный конвертер BooleanToVisibilityConverter в пространстве имён System.Windows.Controls. Его всегда и используют в подобных случаях. На сколько вижу, по функционалу Ваш вариант полный аналог.
2
[Bicycle Reinventor]
332 / 270 / 109
Регистрация: 19.10.2011
Сообщений: 668
Записей в блоге: 2
12.12.2018, 14:03 5
Элд Хасп, вау, не знал, что есть стандартный, TIL, спасибо.
0
Модератор
Эксперт .NET
15464 / 10710 / 2786
Регистрация: 21.04.2018
Сообщений: 31,531
Записей в блоге: 2
12.12.2018, 14:20 6
Цитата Сообщение от Exerion Посмотреть сообщение
вау, не знал, что есть стандартный, TIL, спасибо.
В этом пространстве ещё есть несколько конвертеров.
0
Почетный модератор
Эксперт С++
5850 / 2861 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
12.12.2018, 18:05  [ТС] 7
Вот я тоже не знал, что стандартный есть, поэтому и свой сделал. А оно вот оно как получилось.
0
12.12.2018, 18:05
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.12.2018, 18:05
Помогаю со студенческими работами здесь

Применение типа bool в цикле: нужен любой простой пример
Помогите разобраться с типом bool в цикле. Как я понял bool принимает значение истина или ложь....

Как написать простой конвертер из wav в mp3
Здравствуйте! Ребят, я в С++ прохо эрудирован, но мне нужено написать простенький конвертер из wav...

Посоветуйте простой бесплатный конвертер mkv в 3gp
Онлайн конвертация не подходит. Исходники объемные, а интернет медленный

Создать простой конвертер с языка Паскаль на язык Basic
Здравствуйте. Нужно реализовать конвертацию : объявление переменных и констант, базовые операторы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru