首页 > 解决方案 > 使用辅助类中的 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 的定义。

所以问题是,我怎样才能在帮助类中做同样的事情来访问这些文本框的名称?

标签: c#wpfmvvm

解决方案


要正确执行 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)。第一次使用它可能看起来需要做很多工作,但是一旦你有很多控件和验证规则,它就很棒了。


推荐阅读