如何使用mvvm命令中文本框的值
本文关键字:文本 中文 何使用 mvvm 命令 | 更新日期: 2023-09-27 17:49:56
我仍然在弄清楚mvvm,我想让我的应用程序通过分割模型视图模型和视图的正确方式。在过去,我总是使用mytextbox.Text.
直接获取视图中文本框的值。我在视图模型中创建了一个命令,将一个新人添加到网络中。但是我无法将文本框的值输入到视图模型中的命令中。
这是我到目前为止的代码In model
public class Person : INotifyPropertyChanged
{
public Person()
{ }
public Person(String FirstName)
{
this._firstName = FirstName;
}
public event PropertyChangedEventHandler PropertyChanged;
private string _firstName;
public string FirstName // the Name property
{
get { return this._firstName; }
set { this._firstName = value; NotifyPropertyChanged("FirstName"); }
}
}
在视图模型中我有
public class NetworkViewModel: INotifyPropertyChanged
{
private ObservableCollection<Person> _networkList1 = new ObservableCollection<Person>();
public ObservableCollection<Person> NetworkList1 //Binds with the listbox
{
get { return _networkList1; }
set { _networkList1 = value; RaisePropertyChanged("NetworkList1"); }
}
public NetworkViewModel()
{
AddPersonCommand = new RelayCommand(AddPerson);
}
private ICommand _addPersonCommand;
public ICommand AddPersonCommand // Binding with view
{
get { return _addPersonCommand; }
set { _addPersonCommand = value; }
}
public void AddPerson(object obj)
{
if(cb_group.Text.ToUpper() == "PRIMARY")
{
_networkList1.Add(new Person(){ FirstName = tb_firstName.Text,});
}
}
在XAML <TextBox x:Name="tb_firstName" Text="{Binding Path=FirstName}"/>
<Button x:Name="btn_add" Command="{Binding AddPersonCommand }"/>
我想让tb_firstname和cb_group的值在视图模型中使用,这样我就可以使命令工作。谢谢你的帮助。我只是边做边学。
现在你的文本框中有:
<TextBox x:Name="tb_firstName" Text="{Binding Path=FirstName}"/>
这意味着它正在你的视图模型上寻找一个名为FirstName的属性,所以你需要为它添加一个字符串属性到你的视图模型。然后,当您在新的Person上设置FirstName时,您只需将其设置为属性。
new Person() { FirstName = this.FirstName };
为了绑定一个组合框,它将需要一个itemsSource——这是项的集合,在您的例子中是要显示的NetworkList1。当它绑定到一个对象列表时,您还需要设置DisplayMemberPath—这是您希望在组合中显示的属性的名称。您还需要绑定SelectedItem属性,并在视图模型中创建一个属性来存储它。这就是你如何知道列表中哪个项是当前选中的。
<Combobox ItemsSource={Binding Path=NetworkList1, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}
SelectedItem = {Binding Path= SelectedPerson, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}
DisplayMemberPath=FirstName/>
viewModel:
public Person SelectedPerson
{
//put in get/set/propertychanged
}
public string FirstName
{
//put in get/set/propertychanged
}
你应该做的是在AddPerson方法中,而不是在控件(cb_group.Text)中使用这些控件绑定到的值。默认情况下,这里的绑定应该是2路的。所以当用户改变值时,它会在你的模型/视图模型中自动更新。如果没有发生这种情况,那么问题就出在你的数据绑定上,你应该看看你的控制台输出中是否有任何数据绑定错误。
您需要添加一个CommandParameter并将其绑定到特定的元素。(在你的例子中是tb_firstname.
文本框版本:
<Button Command="{Binding AddPersonCommand } CommandParameter="{Binding ElementName=tb_firstname, Path=Text"/>
编辑。ComboBox版本:
<Button Command="{Binding AddPersonCommand } CommandParameter="{Binding ElementName=yourComboBox, Path=SelectedItem.Value"/> // or just SelectedItem
EDIT2from(多个命令参数wpf按钮对象)
<Button Content="MultiBindingExample" Command="{Binding MyCommand}">
<Button.CommandParameter>
<MultiBinding Converter="{StaticResource MyMultiConverter}">
<Binding Path="..." ElementName="MyTextBox"/>
<Binding Path="..." ElementName="MySomethingElse"/>
</MultiBinding>
</Button.CommandParameter>