【问题标题】:How to use the value of textbox in mvvm commands如何在 mvvm 命令中使用文本框的值
【发布时间】:2015-05-19 09:27:54
【问题描述】:

我仍在研究 mvvm,我想通过拆分模型视图模型和视图来使我的应用程序以正确的方式运行。过去我总是使用 mytextbox.Text 直接获取视图中文本框的值。

我在视图模型中创建了一个命令来向网络添加一个新人。但我无法将文本框的值放入视图模型中的命令中。

这是我到目前为止的代码 在模型中

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 的值在 viewmodel 中使用,这样我就可以使命令工作。 感谢你的帮助。我只是边走边学。

【问题讨论】:

  • 添加更多上下文。 tb_firstName 绑定的对象(Person?)在哪里? cb_group 是什么以及在哪里?答案可能是将控件所需的值绑定到此 ViewModel 中的属性,然后在执行 AddPerson 时将这些值包含在范围内。

标签: c# wpf xaml mvvm icommand


【解决方案1】:

好的,所以在您当前拥有的文本框中:

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

【讨论】:

  • 是的,我想那是比我更好的解决方案:)
【解决方案2】:

你应该做的是在 AddPerson 方法中而不是在控件中寻找值(cb_group.Text)使用这些控件绑定到的值。默认情况下,这里的绑定应该是 2 方式。因此,当用户更改值时,它将在您的模型/视图模型中自动更新。如果这没有发生,那么问题出在您的数据绑定上,您应该查看控制台输出中是否有任何数据绑定错误。

【讨论】:

    【解决方案3】:

    您需要添加一个 CommandParameter 并将其绑定到特定元素。(在您的情况下为 tb_firstname。

    文本框版本:

    <Button Command="{Binding AddPersonCommand } CommandParameter="{Binding ElementName=tb_firstname, Path=Text"/>
    

    编辑。 组合框版本:

    <Button Command="{Binding AddPersonCommand } CommandParameter="{Binding ElementName=yourComboBox, Path=SelectedItem.Value"/> // or just SelectedItem
    

    EDIT2 来自 (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>
    

    【讨论】:

    • 不过,这无助于获取 cb_group.Text 的任何内容。
    • 哦,抱歉,我没看到他想同时传递两个参数
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-24
    • 2012-10-09
    • 1970-01-01
    相关资源
    最近更新 更多