我正在开发一个 WPF 应用程序,并且我有一个文本框(双向)绑定(bind)到我的 View 模型中的一个属性。
我试图阻止用户在这个文本框中输入超过 100 个字符(这是数据库将存储的最大值),所以我写了这个。
public abstract class AppBaseViewModel : ViewModelBase
{
private String _text;
public String Text
{
get { return _text; }
set
{
_text = CheckTextLength(value, _text);
OnPropertyChanged("Text");
}
}
private string CheckTextLength(string value, string text)
{
if (value.Length < 100)
{
return value;
}
else
{
return text;
}
}
}
所有这些代码似乎所做的只是将前 100 个字符保存到字段中,但它仍然允许用户继续输入超过 100 个字符......我猜这是因为字段值没有被传递回文本框。
我不明白为什么这不起作用,因为我在不同的应用程序中使用 MVVM Light 的 RaisePropertyChange() 做了类似的事情。
值得注意的是,我无法访问文本框的设计器,因此无法将 .Net 文本框属性设置为最大长度。
编辑:只是为了澄清,我无法查看或编辑 xaml,因为有些人建议我无权访问 XAML 文件(我知道,这很愚蠢)。我们使用的所有绑定(bind)默认都是两种方式
最佳答案
您是否尝试过 TextBox.MaxLength ?
<TextBox MaxLength="100"/>
Gets or sets the maximum number of characters that can be manually entered into the text box.
如果无法访问 XAML,则最终获得对 XAML 的访问权,而不是解析和验证数组的长度并在这里和那里使用子字符串。至少这就是我会为这个简单的问题做的事情,或者与设计师交谈以添加那一小段代码。
更新 1
public static T GetChildOfType<T>(DependencyObject depObj) where T : DependencyObject
{
if (depObj == null) return null;
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
{
var child = VisualTreeHelper.GetChild(depObj, i);
var result = (child as T) ?? GetChildOfType<T>(child);
if (result != null) return result;
}
return null;
}
去拿那个 child 并设置它的MaxLength。这只是对 View 的轻微修改,因此不会影响 MVVM 模式。
关于c# - 属性更改时属性未将值传回文本框的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30707405/