使用MVVM和Entity Framework 4.0验证WPF用户输入

时间:2010-05-15 08:52:38

标签: wpf entity-framework .net-4.0

我正在使用MVVM构建WPF 4.0应用程序。使用Entity Framework 4.0生成模型。 我在WPF上使用数据绑定将用户输入绑定到模型属性。

验证用户输入的最简单方法是什么? 我更喜欢一种方法,我可以在模型上设置验证规则,而不是在WPF本身上。如何才能做到这一点?任何样品都表示赞赏。

2 个答案:

答案 0 :(得分:0)

WPF Application Framework (WAF)项目的 BookLibrary 示例应用程序显示了一个MVVM应用程序。它使用实体框架并在模型(实体)类上定义验证规则。

答案 1 :(得分:0)

我找到的最简单方法取自this book,第624-625页。

ViewModel应该实现IDataErrorInfo

private string _newItem;

public string NewItem
        {
            get { return _newItem; }
            set
            {
                if (Equals(_newItem, value)) return;
                _newItem = value;
                SendPropertyChanged("NewItem");
            }
        }

public string this[string propertyName]
        {
            get
            {
                if (propertyName == "NewItem")
                {
                    var valid = NewItem.All(Char.IsLetterOrDigit);
                    if (!valid)
                        return "NewItem can only contain letters and numbers.";
                }
                return null; 
            }
        }

查看长版:

<TextBox>
   <TextBox.Text>
      <Binding UpdateSourceTrigger="PropertyChanged" Path="NewItem">
         <Binding.ValidationRules>
            <DataErrorValidationRule></DataErrorValidationRule>
         </Binding.ValidationRules>
      </Binding>
   </TextBox.Text>
</TextBox>

或简短版本:

<TextBox Text="{Binding NewItem,UpdateSourceTrigger=PropertyChanged,ValidatesOnDataErrors=True}"/>

当规则失败时,它应该在文本框周围创建一个漂亮的红色边框,并且您可以按照您想要的方式使用错误消息,例如将错误消息绑定到文本框工具提示(MSDN):

<Window.Resources>
        <Style x:Key="TextBoxInError" TargetType="TextBox">
            <Style.Triggers>
                <Trigger Property="Validation.HasError" Value="true">
                    <Setter Property="ToolTip"
              Value="{Binding RelativeSource={x:Static RelativeSource.Self},
              Path=(Validation.Errors)[0].ErrorContent}"/>
                </Trigger>
            </Style.Triggers>
        </Style>
    </Window.Resources>

然后将其添加到文本框中:

Style="{StaticResource TextBoxInError}"

干杯!