Pola można dynamicznie włączać i wyłączać w oknie dialogowym Data Standard na podstawie wartości wprowadzanych przez użytkownika. Przykładowo: jeśli istnieje pole kombi, w którym użytkownik wybiera wartość, można automatycznie włączyć nowe pola w oparciu o wybraną wartość.
W tym przykładzie nowe pola są tworzone i grupowane wg pola GroupBox. Zawartość GroupBox jest włączana lub wyłączana w zależności od tekstu wprowadzonego w projekcie pola TextBox.
Poniżej przedstawiono, jak może ona wyglądać w oknie dialogowym:

Aby uprościć czynności, pola zostały pogrupowane w kodzie. W ten sposób można włączyć lub wyłączyć całą grupę w przypadku, gdy reguła zwróci wartość prawda lub fałsz. Dlatego najpierw należy utworzyć obiekt GroupBox, który zawiera pola opcjonalne. Kod przedstawia się następująco:
<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>
W GroupBox, podobnie jak w przypadku większości innych elementów sterujących, zostanie wyświetlona właściwość IsEnabled, która określa, czy element sterujący i jego elementy pochodne są dostępne do użycia. Aby dynamicznie włączać lub wyłączać ten element sterujący i jego elementy potomne, atrybut IsEnabled jest powiązany z właściwością modelu widoku użytkownika (niestandardowa biblioteka DLL) utworzonego w następnej sekcji.
Następnie logika określająca, czy i kiedy element ma być wyłączany lub włączany, jest zapisywana kodzie niestandardowym.
Kod biblioteki DLL przedstawia się następująco:
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"); }
}
}
}
Zdarzenie PropertyChanged w konstruktorze jest przeciążane za pomocą programu obsługi zdarzeń. W ten sposób otrzymujemy powiadomienie za każdym razem, gdy użytkownik stosuje zmiany we właściwości projektu. Aby tego uniknąć, środowisko Visual Studio generuje błąd podczas próby renderowania pliku XAML. Instrukcja if sprawdza, czy jesteśmy w trybie InDesignMode czy nie. W oknie programu obsługi zdarzeń (myViewModel_PropertyValueChanged) pierwsza instrukcja if sprawdza, czy zdarzenie zostało wywołane przez zmianę wartości czy zmianę innego typu. W przypadku zmiany wartości należy sprawdzić, jaką zawartość użytkownik wstawił w polu TextBox i czy wartość „Zaawansowane” została wprowadzona przez użytkownika. Następnie we właściwości IsCustomControlEnabled należy ustawić wartość True.
Skompiluj bibliotekę DLL i wstaw ją do folderu dodatków dla Data Standard.
W pliku XAML należy zadeklarować obecność nowej biblioteki DLL. W nagłówku pliku XAML zdefiniuj alias przestrzeni nazw dla pliku 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">
W tym przykładzie aliasem biblioteki DLL jest xmlns:myvn. Teraz należy zdefiniować klasę jako zasób, tak aby można było jej użyć później w pliku XAML:
<prop:dsWindow.Resources>
<myvm:DataStandardModel x:Name="DataStandardModelResource">
</prop:dsWindow.Resources>
Teraz, gdy użytkownik zmienia właściwość projektu, zdarzenie otrzymuje powiadomienie, niestandardowa logika zaczyna działać i określa, czy we właściwości IsCustomControlEnable ustawić wartość prawda czy fałsz. W oparciu o tę wartość pole GroupBox jest włączane lub wyłączane.