动态地启用和禁用 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,该特性可控制是否启用此控件及其子项以供使用。为了动态地启用或禁用此控件及其子项,IsEnabled 属性被绑定到了在下一部分中创建的自定义视图模型(自定义 DLL)的特性。

然后,是否以及何时应禁用或启用控件的逻辑将写入到自定义代码中。

示例:创建自定义视图模型

通过以下步骤可创建自定义视图模型:
  1. 启动 Visual Studio 并创建类库。项目名称由您自己确定。
  2. 为您可以控制的特性定义构造函数,并创建事件处理程序。在本示例中,我们选择项目特性。如果此特性发生变化,您会相应地收到通知。检查内容,如果其符合您的规则,请设置另一个帮助程序特性的值。
  3. 创建将用于设置控件的启用/禁用行为的帮助程序特性。在本示例中,帮助程序特性称为 IsCustomControlEnabled
  4. 在事件处理程序中定义逻辑,并相应地设置特性。在本示例中,代码将验证项目特性是否包含文字“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 事件。这样,每次用户对项目特性应用更改时,我们都会收到通知。为了避免这种情况,Visual Studio 会在尝试呈现 XAML 文件时生成错误。if 语句会检查我们是否为 InDesignMode。在事件处理程序 (myViewModel_PropertyValueChanged) 中,首先 if 语句会检查事件是否被值更改或其他类型的更改调用。如果是被值更改调用,则我们会检查用户在 TextBox 中插入的内容,如果用户键入的值为“高级”,那么,我们会将特性 IsCustomControlEnabled 设置为“True”。

编译 DLL,并将其放置到 Data Standard 的附加模块文件夹。

示例:在 .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 将变为启用状态或禁用状态。