Динамическое включение и отключение полей в Data Standard в соответствии со значениями, заданными пользователем.
Например, при наличии поля со списком, где пользователь может выбрать значение, можно настроить автоматическое включение новых полей в соответствии с выбранным значением.
В этом примере новые поля создаются и объединяются в группы при помощи элемента GroupBox. Содержимое GroupBox включается или отключается в зависимости от текста, введенного в элементе TextBox.
Это может выглядеть следующим образом:

Для упрощения процесса поля сгруппированы в коде. Таким образом, вся группа может быть включена или отключена в зависимости от того, какое значение принимает правило: 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), создание которой описано в следующем разделе.
Логика, определяющая, следует ли отключить или включить элемент управления, и момент его включения и отключения, описывается в пользовательском коде.
Пример кода библиотеки 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. В заголовке файла 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>
Теперь, когда пользователь изменяет свойство проекта, в событие отправляется уведомление, и задействуется пользовательская логика, которая назначает IsCustomControlEnable значение TRUE или FALSE. В зависимости от этого значения элемент GroupBox включается или отключается.