我有两个带有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)
}
这是我正在努力实现的一般例子
答案 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对象:
IEnumerable
对象集合的行为,包括Add
新对象所需的功能。容器ViewModel将具有您正在努力解决的属性,加上CreateObject
命令以及IEnumerable
(ObservableCollection
)属性来保存现有的ViewModel对象。
在View中,您将有一个控件在现有ViewModel对象中显示数据,第二个控件使用ListView
(或类似)控件来显示现有视图控件和{{{ 1}}控件,以及用于创建新对象的按钮(并将其添加到列表中)。
这还允许您向容器ViewModel添加“删除”,“排序”等功能,而无需更改现有的ViewModel。