Mezők dinamikus engedélyezése és letiltása az Adatszabvány alkalmazásban

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.

Áttekintő példa

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:

Példa: Mezők csoportosítása és az IsEnabled attribútum beállítása

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.

Példa: Egyedi nézetmodell létrehozása

Kövesse ezeket a lépéseket az egyedi nézetmodell létrehozásához:
  1. Indítsa el a Visual Studio alkalmazást, és hozzon létre egy osztálytárat. A projekt tetszőlegesen elnevezhető.
  2. Definiáljon egy konstruktort, majd hozzon létre egy eseménykezelőt a tulajdonsághoz, amelyet vezérelhet. Ebben az esetben ez a projekttulajdonság. A program képes értesítést megjeleníti abban az esetben, ha ez a tulajdonság megváltozik. Ellenőrizze a tartalmat, és ha az megfelel az Ön szabályának, állítsa be az értéket egy másik segítőtulajdonság számára.
  3. Hozza létre a segítőtulajdonságot, amely a vezérlő engedélyezési/letiltási viselkedését fogja szabályozni. Ebben az esetben a segítőtulajdonság neve IsCustomControlEnabled
  4. Az eseménykezelőben definiálja a logikát, majd ennek megfelelően állítsa be a tulajdonságot. Ebben az esetben a kód ellenőrzi, hogy a projekttulajdonság tartalmazza-e az „advanced” szót. Ha ez így van, elérhető válik egy további tulajdonság. Ha nem, akkor a GroupBox tulajdonságai letiltásra kerülnek.

Í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.

Példa: Az új DLL deklarálása az .xaml fájlban

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>

Hozzon létre egy példányt a DataStandardModel osztályból a myvm névtérből (a DLL-fájl), majd adja meg a myViewModelResource aliast, amit később fog felhasználni. Az első lépésben a GroupBox IsEnable tulajdonsága már kötve van az IsCustomControlEnabled változóhoz a DataStandardModelResource erőforrás által amit néhány sorral feljebb definiált.

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.