A rendszer a felhasználó által megadott értékek alapján dinamikusan engedélyezi és letiltja az Adatszabvány párbeszédpanel mezőit.
Ha például egy legördülő listában a felhasználó kiválaszt egy értéket, automatikusan engedélyezhet új mezőket a kiválasztott érték alapján.
Ebben a példában új mezőket hozunk létre, melyeket egy GroupBox szerint csoportosítunk. A GroupBox tartalom engedélyezése vagy letiltása a TextBox projektbe beírt szöveg alapján történik.
Itt láthatja, hogyan jelenhet ez meg a párbeszédpanelen:

A lépések egyszerűsítése érdekében a mezők csoportosítva szerepelnek a kódban. Így a teljes csoport engedélyezhető vagy letiltható, ha egy szabály igaz vagy hamis értéket ad vissza. Először hozzon létre egy GroupBox elemet, amely tartalmazza az opcionális mezőket. Íme a kód:
<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>
A GroupBox, mint minden más vezérlő, láthatóvá teszi az IsEnabled tulajdonságot, amely azt vezérli, hogy a vezérlő és gyermekei használata engedélyezve van-e, vagy sem. A vezérlő és annak gyermekei dinamikus engedélyezéséhez vagy letiltásához az IsEnabled attribútum egy egyedi nézetmodell (egyedi DLL) tulajdonsághoz van kötve, ennek létrehozását a következő szakasz ismerteti.
Ezután meghatározható a vezérlő letiltását vagy engedélyezését szabályozó logika az egyedi kódban.
Íme a DLL-kód:
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"); }
}
}
}
A konstruktorban a PropertyChanged eseményt egy eseménykezelővel terhelték túl. Ez által minden alkalommal értesítést kap, amikor a felhasználó változtatásokat hajt végre a projekttulajdonságon. Ennek elkerülése érdekében a Visual Studio hibát generál, amikor a program megkísérli renderelni az XAML fájlt. Az if utasítás ellenőrzi, hogy InDesignMode állapotban vagyunk-e, vagy sem. Az eseménykezelőben (myViewModel_PropertyValueChanged) az első if utasítás ellenőrzi, hogy az eseményt értékváltozás vagy más típusú változás hívta-e be. Értékváltozás esetén ellenőrizzük, hogy a felhasználó mit írt be a TextBox-ba, és ha a felhasználó az „advanced” értéket írta be, akkor az IsCustomControlEnabled tulajdonságot igaz értékre állítjuk.
Kompilálja a DLL-t és helyezze el a bővítmény az Adatszabvány mappájába.
Deklarálja az XAML-fájlban az új DLL létezését. Az XAML fájl fejléc részében definiáljon egy névtéraliast a DLL számára:
<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">
A példában az xmlns:myvn a DLL alias. Most definiálja az osztályt, mint erőforrást, így azt később az XAML-ben is használhatja:
<prop:dsWindow.Resources>
<myvm:DataStandardModel x:Name="DataStandardModelResource">
</prop:dsWindow.Resources>
Mostantól amikor a felhasználó módosítja a projekttulajdonságot, Ön értesítést kap az eseményről, az egyedi logika végrehajtásra kerül, és eldönti, hogy az IsCustomControlEnable értéke igaz vagy hamis. Ezen érték alapján megtörténik a GroupBox engedélyezése vagy letiltása.