WPF验证在datacontext中没有对象

时间:2011-03-17 20:42:03

标签: wpf

这个让我发疯: - )

假设我有一些测试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?只需将验证器与验证器组放在一起即可。它会比现在更加神秘和复杂。

2 个答案:

答案 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,然后最后命中数据库。

也许肯特的方法有效,但在复杂的情况下却不行。