如何在 mvvm 命令中使用文本框的值
How to use the value of textbox in mvvm commands
我仍在研究 mvvm,我想通过拆分模型视图模型和视图来使我的应用程序以正确的方式运行。以前我都是直接用mytextbox.Text.
取view中textbox的值
我在视图模型中创建了一个命令来向网络中添加一个新人。但我无法将文本框的值输入到视图模型中的命令中。
这是我目前的代码
在模型中
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 的值,这样我就可以使命令工作。
感谢你的帮助。我边走边学。
您需要添加一个 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
编辑2
来自 (Multiple command parameters wpf button object)
<Button Content="MultiBindingExample" Command="{Binding MyCommand}">
<Button.CommandParameter>
<MultiBinding Converter="{StaticResource MyMultiConverter}">
<Binding Path="..." ElementName="MyTextBox"/>
<Binding Path="..." ElementName="MySomethingElse"/>
</MultiBinding>
</Button.CommandParameter>
您应该在 AddPerson 方法中执行操作,而不是在控件 (cb_group.Text) 中查找值,使用这些控件绑定到的值。默认情况下,绑定应为 2 种方式。因此,当用户更改值时,它会自动在您的 model/viewmodel 中更新。如果这没有发生,那么问题出在你的数据绑定上,你应该看看你的控制台输出中是否有任何数据绑定错误。
好的,在您的文本框中,您当前拥有:
<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/>
视图模型:
public Person SelectedPerson
{
//put in get/set/propertychanged
}
public string FirstName
{
//put in get/set/propertychanged
}
我仍在研究 mvvm,我想通过拆分模型视图模型和视图来使我的应用程序以正确的方式运行。以前我都是直接用mytextbox.Text.
取view中textbox的值我在视图模型中创建了一个命令来向网络中添加一个新人。但我无法将文本框的值输入到视图模型中的命令中。
这是我目前的代码 在模型中
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 的值,这样我就可以使命令工作。 感谢你的帮助。我边走边学。
您需要添加一个 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
编辑2 来自 (Multiple command parameters wpf button object)
<Button Content="MultiBindingExample" Command="{Binding MyCommand}">
<Button.CommandParameter>
<MultiBinding Converter="{StaticResource MyMultiConverter}">
<Binding Path="..." ElementName="MyTextBox"/>
<Binding Path="..." ElementName="MySomethingElse"/>
</MultiBinding>
</Button.CommandParameter>
您应该在 AddPerson 方法中执行操作,而不是在控件 (cb_group.Text) 中查找值,使用这些控件绑定到的值。默认情况下,绑定应为 2 种方式。因此,当用户更改值时,它会自动在您的 model/viewmodel 中更新。如果这没有发生,那么问题出在你的数据绑定上,你应该看看你的控制台输出中是否有任何数据绑定错误。
好的,在您的文本框中,您当前拥有:
<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/>
视图模型:
public Person SelectedPerson
{
//put in get/set/propertychanged
}
public string FirstName
{
//put in get/set/propertychanged
}