这个让我发疯: - )
假设我有一些测试xaml代码:
<Window x:Class="ProWPFInCSharpyTestProject.ValidationTest"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="ValidationTest" Height="300" Width="300">
<Grid>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<TextBox Margin="10" Name="someTextBox" VerticalAlignment="Top" Text="" />
<TextBox Grid.Row="1" Margin="10" Name="SomeTextBox2" VerticalAlignment="Top" />
<TextBlock Grid.Row="2" Margin="10" Name="errorMessageTextBlock" />
<Button Content="Click Me" Grid.Row="3" Margin="10" VerticalAlignment="Top" />
</Grid>
</Window>
现在,我有没有对象绑定它,因为它将从表单中收集数据并将其放入数据库中。但是现在我想验证单击按钮时字段是否为空并显示错误消息。我看过的几乎每一个教程都有一个绑定到网格的对象,但这与我无关。
为什么这不能更像asp.net?只需将验证器与验证器组放在一起即可。它会比现在更加神秘和复杂。
答案 0 :(得分:1)
好的,假设你真的不想要一个模型:
<TextBox Margin="10" Name="someTextBox" VerticalAlignment="Top" Text="" />
<TextBox Grid.Row="1" Margin="10" Name="SomeTextBox2" VerticalAlignment="Top" />
<TextBlock Grid.Row="2" Margin="10" Name="errorMessageTextBlock" />
<Button Name="button" Content="Click Me" Grid.Row="3" Margin="10" VerticalAlignment="Top" />
然后在后面的代码中:
button.Click += delegate
{
if (someTextBox.Text == "" && someTextBox2.Text == "")
{
MessageBox.Show("Error!");
}
else
{
DoSomethingCool();
}
};
作为一种使用验证基础架构而不定义自己的模型的黑客方法,您可以这样做:
<TextBox>
<TextBox.Text>
<Binding Path="Tag" RelativeSource="{RelativeSource Self}">
<Binding.ValidationRules>
<!-- whatever rules you want here -->
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
这会劫持TextBox.Tag
属性作为存储绑定数据的位置,这使您可以使用Binding.ValidationRules
。
但是,如果不使用数据绑定,你真的会抵制WPF最强大的吸引力之一。
执行此操作的简洁方法是定义模型,将视图绑定到该模型,并在模型中实现IDataErrorInfo
(如果要进行验证)。
答案 1 :(得分:1)
对不起,伙计,但你在做WPF而不是ASP.NET。我知道WPF可能令人沮丧,但将技术转变为旧习惯并不是一个好主意。 话虽如此,您所说的是收集输入的数据然后将其传递给数据库。 在WPF中执行此操作的一种方法是使用ViewModel或任何对象充当某种容器。 WPF绑定的东西会告诉你是否出了什么问题。然后,您可以将对象传递/转换为数据层/ ORM,然后最后命中数据库。
也许肯特的方法有效,但在复杂的情况下却不行。