如何使用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的值在视图模型中使用,这样我就可以使命令工作。谢谢你的帮助。我只是边做边学。

如何使用mvvm命令中文本框的值

现在你的文本框中有:

<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>