【发布时间】:2016-03-28 05:53:04
【问题描述】:
我正在使用 Visual Studio 2015 Update 1 构建一个 MVVM Light WPF 应用程序。我有以下两个搜索字段:cmbSearchColumn 和 txtSearchValue。当用户单击搜索按钮时,两者都不能为空。请注意,我为这两个字段设置了ValidationRules。
这是相关的 XAML:
<TextBlock Grid.Row="1"
Grid.Column="0"
Style="{StaticResource FieldLabel}">
Search Column
</TextBlock>
<StackPanel Grid.Row="1"
Grid.Column="1"
Style="{StaticResource ValidationStackPanel}">
<ComboBox x:Name="cmbSearchColumn"
DisplayMemberPath="MemberName"
IsEditable="True"
ItemsSource="{Binding SearchColumns}"
SelectedValuePath="MemberValue"
Style="{StaticResource ComboBoxStyle}">
<ComboBox.SelectedItem>
<Binding Mode="TwoWay"
Path="SelectedColumn}"
UpdateSourceTrigger="Explicit">
<Binding.ValidationRules>
<helpers:NotEmptyStringValidationRule
Message="Search Column cannot be blank." ValidatesOnTargetUpdated="True" />
</Binding.ValidationRules>
</Binding>
</ComboBox.SelectedItem>
</ComboBox>
<TextBlock Style="{StaticResource FieldLabelError}"
Text="{Binding (Validation.Errors)[0].ErrorContent, ElementName=cmbSearchColumn}" />
</StackPanel>
<TextBlock Grid.Row="2"
Grid.Column="0"
Padding="0 0 9 9"
Style="{StaticResource FieldLabel}">
Search Value
</TextBlock>
<StackPanel Grid.Row="1"
Grid.Column="1"
Style="{StaticResource ValidationStackPanel}">
<TextBox x:Name="txtSearchValue" Style="{StaticResource FieldTextBox}">
<TextBox.Text>
<Binding Mode="TwoWay"
Path="SearchValue"
UpdateSourceTrigger="Explicit">
<Binding.ValidationRules>
<helpers:NotEmptyStringValidationRule
Message="Search Value cannot be blank." ValidatesOnTargetUpdated="True" />
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
<TextBlock Style="{StaticResource FieldLabelError}"
Text="{Binding (Validation.Errors)[0].ErrorContent, ElementName=txtSearchValue}" />
</StackPanel>
<Button Grid.Row="4"
Grid.Column="1"
Command="{Binding SearchEmployeesRelayCommand}"
Content="Search"
Style="{StaticResource FieldButton}" />
当应用加载时,它会立即在字段旁边显示错误,指出它们不能为空。但是,只有当用户单击“搜索”按钮时,我才需要触发对它们的验证。
我该怎么做?谢谢。
【问题讨论】:
-
我还没有阅读您发布的全部代码,但我认为您应该使用
ICommand.CanExecute()函数简单地禁用搜索按钮(当您的验证条件失败时返回 false) - 您还应该订阅更改您正在使用的属性的视图模型并相应地提高ICommand.CanExecuteChanged -
谢谢,@Maverik。去查找那些语法,看看如何正确地做到这一点:)
-
@Maverik 我认为 OP 要求相反。如果验证失败,他不想禁用该按钮。他希望验证错误消息仅在单击按钮时出现。
-
@qqww2 从表面上看,观察结果是正确的,但在我们的WPF chat room 中,Alex 来并发布了问题,其中包含更多上下文。这只是解决他的功能问题。这里没有提到 UX 解决方案。一旦我们在房间里讨论的事情达成一致,也许我会发布一个完整的解决方案
-
如果您觉得可以,将
ValidatesOnTargetUpdated设置为False会阻止程序加载时的第一次验证。
标签: c# wpf validation mvvm