您可以根据用户输入的值动态地启用和禁用“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,该特性可控制是否启用此控件及其子项以供使用。为了动态地启用或禁用此控件及其子项,IsEnabled 属性被绑定到了在下一部分中创建的自定义视图模型(自定义 DLL)的特性。
然后,是否以及何时应禁用或启用控件的逻辑将写入到自定义代码中。
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 定义命名空间别名:
<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 将变为启用状态或禁用状态。