Динамическое включение и отключение полей в Data Standard

Динамическое включение и отключение полей в Data Standard в соответствии со значениями, заданными пользователем.

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

Обзор примера

В этом примере новые поля создаются и объединяются в группы при помощи элемента GroupBox. Содержимое GroupBox включается или отключается в зависимости от текста, введенного в элементе TextBox.

Это может выглядеть следующим образом:

Пример: группирование полей и настройка атрибута IsEnabled

Для упрощения процесса поля сгруппированы в коде. Таким образом, вся группа может быть включена или отключена в зависимости от того, какое значение принимает правило: TRUE или FALSE. Сначала необходимо создать элемент GroupBox, в котором будут содержаться дополнительные поля. Пример кода:

<GroupBox

      Header="Advanced project information" Grid.Row="2" HorizontalAlignment="Stretch" VerticalAlignment="Top"

      IsEnabled="{Binding Source={StaticResource DataStandardModelResource}, Path=IsCustomControlEnabled}">

  <Grid>

    <Grid.RowDefinitions>

      <RowDefinition Height="*"/>

      <RowDefinition Height="*"/>

      <RowDefinition Height="*"/>

    </Grid.RowDefinitions>

    <Grid.ColumnDefinitions>

      <ColumnDefinition Width="120"/>

      <ColumnDefinition Width="*"/>

    </Grid.ColumnDefinitions>

    <Label Content="Project number" Grid.Column="0" Grid.Row="0" />

    <TextBox Text="{Binding Prop[ProjectNumber].Value}" Grid.Column="1" Grid.Row="0"/>

    <Label Content="Cost Center" Grid.Column="0" Grid.Row="1" />

    <TextBox Text="{Binding Prop[Costcenter].Value}" Grid.Column="1" Grid.Row="1"/>

    <Label Content="Delivery date" Grid.Column="0" Grid.Row="2" />

    <TextBox Text="{Binding Prop[DeliveryDate].Value}" Grid.Column="1" Grid.Row="2"/>

  </Grid>

</GroupBox>

В элементе GroupBox, как и в остальных элементах управления, отображается свойство IsEnabled, которое определяет, доступен ли для использования элемент управления и его дочерние элементы. Чтобы динамически включать и отключать этот элемент управления и его дочерние элементы, выполняется привязка атрибута IsEnabled к свойству модели пользовательского вида (пользовательская библиотека DLL), создание которой описано в следующем разделе.

Логика, определяющая, следует ли отключить или включить элемент управления, и момент его включения и отключения, описывается в пользовательском коде.

Пример: создание модели пользовательского вида

Для создания модели пользовательского вида выполните следующие действия.
  1. Запустите Visual Studio и создайте библиотеку классов. Задайте имя проекта.
  2. Для управляемого свойства нужно задать конструктор и создать обработчик событий. В данном случае это свойство проекта. Изменение этого свойства будет сопровождаться уведомлением. Изучите содержимое и, если оно соответствует правилу, задайте значение для другого вспомогательного свойства.
  3. Создайте вспомогательное свойство, которое будет использоваться для настройки процессов включения и отключения элемента управления. В данном случае вспомогательное свойство называется IsCustomControlEnabled
  4. Определите логику в обработчике событий и настройте свойство соответствующим образом. В данном случае код необходим для проверки наличия текста "advanced" в свойстве проекта. Если содержит, то становится доступным дополнительное свойство. Если нет, то свойства элемента GroupBox отключаются.

Пример кода библиотеки DLL:

namespace DynEnableDisable

{

    public class DataStandardModel : CustomerViewModelBase

    {

        public DataStandardModel()

        {

            if(!base.IsInDesignMode)

                base.Properties["Project"].PropertyChanged += DataStandardModel_ProjectValueChanged;

        }

 

        void myViewModel_ProjectValueChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)

        {

            if (e.PropertyName == "Value")

            {

                if (Properties["Project"].Value.ToString().ToLower().Contains("advanced")) IsCustomControlEnabled = true;

                else IsCustomControlEnabled = false;

            }

        }

        private bool _IsCustomControlEnabled = false;

        public bool IsCustomControlEnabled

        {

            get { return _IsCustomControlEnabled; }

            private set { _IsCustomControlEnabled = value; OnPropertyChanged("IsCustomControlEnabled"); }

        }

    }

}

В конструкторе обработчик событий используется для перегрузки события PropertyChanged. Благодаря этому уведомление отправляется каждый раз, когда пользователь применяет изменения к свойству Project. Чтобы этого избежать, Visual Studio выдает ошибку при попытке визуализации файла XAML. Оператор IF проверяет, выполнен ли переход в режим InDesignMode. В обработчике событий (myViewModel_PropertyValueChanged) первый оператор IF проверяет, присвоено ли событию имя в связи с изменением значения или в связи с другим изменением. В случае изменения значения выполняется проверка данных, добавленных пользователем в TextBox. Если пользователем введено значение "advanced", для свойства IsCustomControlEnabled задается значение TRUE.

Выполните компиляцию библиотеки DLL и поместите ее в папку надстроек для Data Standard.

Пример: объявление новой библиотеки DLL в файле XAML

Объявите новую библиотеку DLL в файле XAML. В заголовке файла XAML определите псевдоним пространства имен библиотеки DLL:

<prop:dsWindow

    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

    xmlns:prop="clr-namespace:dataStandard.UI.View;assembly=dataStandard.UI"

    xmlns:myvm="clr-namespace:DynEnableDisable;assembly=DynEnableDisable"

    x:Name="MainWindow" Title="{Binding PathAndFileNameHandler.FileName}" WindowStyle="ToolWindow" ShowInTaskbar="False"

    Topmost="True" SizeToContent="WidthAndHeight">

Псевдоним библиотеки DLL, используемый в примере, — xmlns:myvn. Теперь необходимо определить класс в качестве ресурса, чтобы использовать его позднее в XAML:

<prop:dsWindow.Resources>

    <myvm:DataStandardModel x:Name="DataStandardModelResource">

</prop:dsWindow.Resources>

Из пространства имен myvm (библиотека DLL) создается экземпляр класса DataStandardModel, и ему присваивается псевдоним myViewModelResource, который будет использоваться позднее. На первом этапе свойство IsEnable элемента GroupBox уже связано со свойством IsCustomControlEnabled при помощи ресурса DataStandardModelResource, описанного несколькими строками выше.

Теперь, когда пользователь изменяет свойство проекта, в событие отправляется уведомление, и задействуется пользовательская логика, которая назначает IsCustomControlEnable значение TRUE или FALSE. В зависимости от этого значения элемент GroupBox включается или отключается.