2

我的项目中有一个对话框,用户在其中输入一些值,当他点击确定时,我将一个项目添加到我的数据库中。我正在使用Entity Framework,所以我添加到数据库代码是这样的:

TransactionItem _item = new TransactionItem();
                _item.DoctorID = (int)cmbDoctor.SelectedValue;
                _item.TransactionCategoryID = (int)_dlg.cmbCat.SelectedValue;
                _item.TransactionMethodID = (int)_dlg.cmbMethod.SelectedValue;
                _item.Amount = int.Parse(_dlg.txtAmount.Text);
                _item.DocumentID = _dlg.txtDocNum.Text;
                _item.Info = _dlg.txtInfo.Text;
                _item.Date = _dlg.dteDate.SelectedDate.ToString();
                _db.TransactionItems.Add(_item);
                _db.SaveChanges();

但问题是没有什么可以绑定和启用验证。我尝试在我的窗口中创建一个空对象并将文本框绑定到它,但它有其自身的问题并且没有按预期工作。我只想在用户输入值或点击确定时检查所有字段是否有效(例如,问题之一是如果用户没有输入任何值,即使启用了stringnotnull验证器,它仍然有效,但是最重要的问题是它自动将文本框的文本设置为空并将其标记为空值)。

我已经制作了自己的验证器,下面是我如何在我的一个文本框中实现它们的示例:

<TextBox Name="txtAmount" HorizontalAlignment="Left" Height="23" Margin="83,169,0,0" VerticalAlignment="Top" Width="224" Tag="T">
    <TextBox.Text>
        <Binding  Path="myitem" ElementName="myWindow" UpdateSourceTrigger="PropertyChanged">
            <Binding.ValidationRules>
                <Validators:StringNullValidationRule/>
                <Validators:IsNumericValidationRule/>
            </Binding.ValidationRules>
        </Binding>
    </TextBox.Text>
</TextBox>
4

2 回答 2

1

为什么不在视图模型中为用户需要输入的每个值创建一个属性并绑定到它?然后,您可以在添加项目时使用这些属性。例如:

视图模型:

public int Amount { get; set; }

...

public void AddItem()
{
    TransactionItem _item = new TransactionItem();

    // ...

    _item.Amount = Amount;
}

XAML:

<TextBox Name="txtAmount" HorizontalAlignment="Left" Height="23" Margin="83,169,0,0" VerticalAlignment="Top" Width="224" Tag="T">
    <TextBox.Text>
        <Binding Path="DataContext.Amount" ElementName="myWindow">
            <Binding.ValidationRules>
                <Validators:StringNullValidationRule/>
                <Validators:IsNumericValidationRule/>
            </Binding.ValidationRules>
        </Binding>
    </TextBox.Text>
</TextBox>

我还建议查看INotifyDataErrorInfo接口(或者IDataErrorInfo interface如果您使用的是 .NET 4.0 或更低版本)来实现验证。

于 2013-08-10T21:49:35.567 回答
1

使用 IDataErrorInfo 接口。您可以根据您的设计在 ViewModel 或 Model 类中实现它。如何做到这一点的一个例子是在WPF 中: Validation made easy with IDataErrorInfo

我建议您阅读这篇精彩的 Josh Smith 文章:具有模型-视图-视图模型设计模式的 WPF 应用程序。在那里您可以看到一个很好的验证示例。

于 2013-08-11T09:45:44.797 回答