MVVM:我应该将文本框直接绑定到模型还是应该先创建一个完整的 属性?
MVVM: Should I bind the textboxes directly to the model or should I create a full property first?
所以我有一个这样的文本框:
<TextBox x:Name="FirstName" Width="100" />
我有一个这样的模型:
public class Person
{
public string FirstName { get; set; }
}
我的视图模型应该是这样的吗:
private Person _person;
public string FirstName
{
get => _person.FirstName;
set => _person.FirstName = value;
}
或
private string _firstName;
public string FirstName
{
get { return _firstName; }
set
{
_firstName = value;
NotifyOfPropertyChange(FirstName);
}
}
然后再创建 person 对象?
这样做,就不需要关心Person
对象的创建了。
private Person _person;
public string FirstName
{
get => _person.FirstName;
set
{
_person.FirstName = value;
NotifyOfPropertyChange(nameof(FirstName));
}
}
至少有一个很好的理由表明您不应将视图模型 属性 绑定到您的模型。视图模型 属性 绑定到用户想要输入的任何内容,就您的模型而言,这些输入可能有效也可能无效。如果您像现在这样有效地使用该模型,那么您将必须确保您的模型能够进入可能无效的状态。这是我不愿意做的事情。视图模型在那里接收来自用户的输入。虽然您可以通过为输入控件指定有效状态(例如在这种情况下名称不能超过 100 个字符)来确保视图模型状态始终有效,但可能存在您无法阻止用户输入的无效输入通过排除输入控件中的输入。这些状态将需要由视图模型本身处理。
虽然在视图模型和模型之间复制大量属性可能很痛苦,但它们执行的工作不同。
所以我有一个这样的文本框:
<TextBox x:Name="FirstName" Width="100" />
我有一个这样的模型:
public class Person
{
public string FirstName { get; set; }
}
我的视图模型应该是这样的吗:
private Person _person;
public string FirstName
{
get => _person.FirstName;
set => _person.FirstName = value;
}
或
private string _firstName;
public string FirstName
{
get { return _firstName; }
set
{
_firstName = value;
NotifyOfPropertyChange(FirstName);
}
}
然后再创建 person 对象?
这样做,就不需要关心Person
对象的创建了。
private Person _person;
public string FirstName
{
get => _person.FirstName;
set
{
_person.FirstName = value;
NotifyOfPropertyChange(nameof(FirstName));
}
}
至少有一个很好的理由表明您不应将视图模型 属性 绑定到您的模型。视图模型 属性 绑定到用户想要输入的任何内容,就您的模型而言,这些输入可能有效也可能无效。如果您像现在这样有效地使用该模型,那么您将必须确保您的模型能够进入可能无效的状态。这是我不愿意做的事情。视图模型在那里接收来自用户的输入。虽然您可以通过为输入控件指定有效状态(例如在这种情况下名称不能超过 100 个字符)来确保视图模型状态始终有效,但可能存在您无法阻止用户输入的无效输入通过排除输入控件中的输入。这些状态将需要由视图模型本身处理。
虽然在视图模型和模型之间复制大量属性可能很痛苦,但它们执行的工作不同。