ユーザが入力した値に基づいて、Data Standard ダイアログのフィールドを動的に有効にしたり無効にすることができます。たとえば、コンボ ボックスでユーザが値を選択した場合、選択した値に基づいて、新しいフィールドを自動的に有効にすることができます。
この例では、新しいフィールドを作成して、GroupBox でグループ化します。GroupBox のコンテンツは、TextBox プロジェクトに入力されたテキストに基づいて、有効または無効になります。
ダイアログでどのように表示されるかを次に示します。
手順を簡素化するために、コード内のフィールドをグループ化します。この方法では、ルールに基づいて 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 属性をバインドします。
コントロールをどのような条件でいつ無効または有効にするかのロジックをカスタム コードに記述します。
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 の名前空間エイリアスを次のように定義します。
<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>
これで、ユーザがプロジェクト プロパティを編集すると、イベントにより通知が行われ、カスタム ロジックが機能し、IsCustomControlEnable を true に設定するか、false に設定するかが決定されます。この値に基づいて、GroupBox が有効または無効になります。