将文本框数据传输到我的ViewModel

时间:2016-08-15 12:37:01

标签: c# wpf xaml

我有两个带有userinput的文本框,我需要将数据传输到我的ViewModel。我尝试通过将其绑定到一个按钮来查看如何执行此操作(因为传输应该在按钮点击时进行),但大多数建议使用绑定。但是,要使用绑定,您必须在ViewModel(afaik)中声明属性,但由于这些字符串用于创建新对象,因此保留它们的属性几乎是理想的,因为将来两个文本框可能会扩展到10以上。我也尝试过使用CommandParameter,但我似乎只能申报一个。

所以澄清: 如何将两个(或更多)文本框的内容传输到相应的ViewModel,以便我可以用它们创建一个新的对象?

编辑: 此外,我还希望能够在处理数据的方法成功完成后将Text=字段重置为空。

视图

<TextBox Name="UI1"/>
<TextBox Name="UI2"/>
<Button Source="*ImageSource*" Command="{Binding CallCreateObject}"/>

和ModelView

private void OnCallCreateObject()
{
   Object newObject = new Object(UI1, UI2, false)
}

这是我正在努力实现的一般例子

3 个答案:

答案 0 :(得分:0)

如果要在Button Click上将数据从UI插入到ViewModel,则没有理由使用绑定。绑定主要用于在UI和底层模型之间同步数据。

如果您只想在button_click事件中进行,那么您可以执行此类操作。

private void button_Click(object sender, RoutedEventArgs e)
    {
        Model model = new Model();
        model.Property1 = textBox1.Text;
        model.Property2 = textBox2.Text;

        textBox1.Text = string.Empty;
        textBox2.Text = string.Empty;
    }

这将解决您的问题。但是当你有一个更好的东西被称为'Binding'

时,不推荐这种方法

答案 1 :(得分:0)

你可以使用这样的绑定:

<TextBox Name="UI1" Text="{Binding Path=Ut1Value}"/>
<TextBox Name="UI2" Text="{Binding Path=Ut2Value}"/>
<Button Source="*ImageSource*" Command="{Binding CreateTheThingCommand}"/>                

然后在您的viewmodel中,您需要具有以下属性和命令:

private string _ut1Value;
private string _ut2Value;

public string Ut1Value
{
    get
    {
        return _ut1Value;
    }

    set
    {
        if (_ut1Value!= value)
        {
            _ut1Value= value;

            OnPropertyChanged("Ut1Value");
        }
    }
}

public string Ut2Value
{
    get
    {
        return _ut2Value;
    }

    set
    {
        if (_ut2Value!= value)
        {
            _ut2Value= value;

            OnPropertyChanged("Ut2Value");
        }
    }
}


public ICommand CreateTheThingCommand
{
    get { return new RelayCommand(CreateTheThing); }
}

private void CreateTheThing()
{
    Object newObject = new Object(_ut1Value, _ut2Value, false);
    // Do whatever with your new object
}

答案 2 :(得分:0)

听起来好像你需要至少两个ViewModel对象:

  1. 用于显示现有对象的数据。这基本上就是你已经拥有的东西。
  2. 容器ViewModel。这封装了IEnumerable对象集合的行为,包括Add新对象所需的功能。
  3. 容器ViewModel将具有您正在努力解决的属性,加上CreateObject命令以及IEnumerableObservableCollection)属性来保存现有的ViewModel对象。

    在View中,您将有一个控件在现有ViewModel对象中显示数据,第二个控件使用ListView(或类似)控件来显示现有视图控件和{{{ 1}}控件,以及用于创建新对象的按钮(并将其添加到列表中)。

    这还允许您向容器ViewModel添加“删除”,“排序”等功能,而无需更改现有的ViewModel。