Data Standard のフィールドを動的に有効および無効にする

ユーザが入力した値に基づいて、Data Standard ダイアログのフィールドを動的に有効にしたり無効にすることができます。たとえば、コンボ ボックスでユーザが値を選択した場合、選択した値に基づいて、新しいフィールドを自動的に有効にすることができます。

例の概要

この例では、新しいフィールドを作成して、GroupBox でグループ化します。GroupBox のコンテンツは、TextBox プロジェクトに入力されたテキストに基づいて、有効または無効になります。

ダイアログでどのように表示されるかを次に示します。

例: フィールドをグループ化して IsEnabled 属性を設定する

手順を簡素化するために、コード内のフィールドをグループ化します。この方法では、ルールに基づいて false または true が返された場合、グループ全体を無効または有効にすることができます。まず、オプションのフィールドを格納する 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 プロパティを公開します。このプロパティは、コントロールとその子を有効にして使用できるようにするかどうかをコントロールします。このコントロールとその子を動的に有効または無効にするには、次のセクションで作成するカスタム ビュー モデル(カスタム DLL)のプロパティに IsEnabled 属性をバインドします。

コントロールをどのような条件でいつ無効または有効にするかのロジックをカスタム コードに記述します。

例: カスタム ビュー モデルを作成する

カスタム ビュー モデルを作成するには、次の手順を実行します。
  1. Visual Studio を起動し、クラス ライブラリを作成します。任意のプロジェクト名を指定します。
  2. コンストラクタを定義し、コントロール可能なプロパティのイベント ハンドラを作成します。この例では、プロジェクト プロパティが該当します。このプロパティが変更されると、通知を受信できます。コンテンツを確認し、ルールに準拠しているかどうかを確認して、別のヘルパー プロパティの値を設定します。
  3. コントロールの有効化と無効化の動作を設定するために使用するヘルパー プロパティを作成します。この例では、ヘルパー プロパティに IsCustomControlEnabled を指定しています。
  4. イベント ハンドラでロジックを定義し、このロジックに基づいてプロパティを設定します。この例では、プロジェクト プロパティにテキスト "advanced" が含まれているかどうかがコードで確認されます。"advanced" が含まれている場合は、追加のプロパティを使用できるようになります。"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 イベントをオーバーロードします。これにより、ユーザがプロジェクト プロパティに変更内容を適用するたびに、通知を受けるようになります。通知を行わない場合、XAML ファイルのレンダリングを試行すると、Visual Studio でエラーが生成されます。if ステートメントは、InDesignMode になっているかどうかを確認します。イベント ハンドラ(myViewModel_PropertyValueChanged)で、最初の if ステートメントは、イベントが値の変更で呼び出されているか、別のタイプの変更で呼び出されているかを確認します。値の変更の場合、ユーザが TextBox に挿入したコンテンツを確認し、ユーザが値 "advanced" を入力していた場合は、IsCustomControlEnabled プロパティを true に設定します。

DLL をコンパイルし、Data Standard の add-ins フォルダに配置します。

例: .xaml ファイルで新しい DLL を宣言する

XAML ファイルで新しい DLL の存在を宣言します。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">

この例では、xmlns:myvn が DLL のエイリアスです。次に、XAML で後で使用できるように、クラスをリソースとして定義します。

<prop:dsWindow.Resources>

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

</prop:dsWindow.Resources>

myvm 名前空間(DLL)から DataStandardModel クラスのインスタンスを作成し、エイリアス myViewModelResource を割り当てます。これは、後ほど役立ちます。最初の手順では、上の数行で定義した DataStandardModelResource リソースを使用して、GroupBox の IsEnable プロパティを IsCustomControlEnabled にバインドしました。

これで、ユーザがプロジェクト プロパティを編集すると、イベントにより通知が行われ、カスタム ロジックが機能し、IsCustomControlEnable を true に設定するか、false に設定するかが決定されます。この値に基づいて、GroupBox が有効または無効になります。