c# - 使用辅助类中的 MVVM 模型从 WPF 应用程序获取 TextBox 名称
问题描述
所以我正在尝试使用 WPF 构建一个 MVVM 应用程序,但我遇到了这个问题:在视图类中,我有一个文本框列表,我想要访问这些文本框以验证输入。所以我设法通过在视图类中编写来做到这一点,并且它有效:
var list = mainGrid.Children.OfType<TextBox>().ToList();
var dictOfTb = new Dictionary<string, string>();
foreach (var item in list)
{
dictOfTb.Add(item.Name, item.Text);
}
但问题是我试图尊重 MVVM 模式,我应该在一个帮助器类中对此进行处理,让我们称之为 ModelsPageHelper,并从视图中访问它,因为这里我要做的是只从UI 并将其传递给 viewModel 以获取结果,然后显示它。所以在这个类中我写了一个方法,GetValuesFromTextBoxes(List<TextBox> textBoxes)
我正在写相同的代码,但现在我收到一条消息,说 TextBox 不包含 Name 的定义。
所以问题是,我怎样才能在帮助类中做同样的事情来访问这些文本框的名称?
解决方案
要正确执行 MVVM,您必须停止考虑验证文本框的代码,而是考虑一个验证自身的 ViewModel,以及一个显示 ViewModel 状态的视图。
例如,如果您有一个Foo
必须具有 value的名为的属性Bar
,则代码将如下所示:
public string FooError { get; private set; }
private string foo;
public string Foo
{
get => return foo;
set
{
foo = value;
if (foo == "Bar") FooError = "";
else FooError = "Foo must be Bar";
NotifyPropertyChanged();
NotifyPropertyChanged(nameof(FooError));
}
}
你的 XAML 看起来像这样:
<TextBox Text={Binding Foo}/>
<TextBlock Text={Binding FooError}/>
那么也许你的保存按钮也可以检查错误。
我强烈建议您查看INotifyDataErrorInfo
,这是一种以 WPF 可以轻松显示的方式组织错误的好方法(而不是像 之类的属性FooError
)。第一次使用它可能看起来需要做很多工作,但是一旦你有很多控件和验证规则,它就很棒了。
推荐阅读
- javascript - OnClick 将 php 文件加载到 HTML
- python - Django ORM不同的值按确定的日期有一个MySQL DB
- installshield - InstallShield 自动修复安装
- python - yfinance.download() 超级慢
- python - 将弱引用转为强引用
- python-3.x - 通过python为当前终端会话设置环境变量
- azure-devops - Azure 开发运维。无法创建新的托管代理池
- linux - Systemd - 无法在自定义位置运行 filebeat 服务
- python - 如何获得每个客户出售物品频率的列?
- python - 让python按“enter”以确认打印对话框