How do I pass the information from View to ViewModel with DelegateCommand?

前端 未结 5 1609
感情败类
感情败类 2021-02-02 18:16

In my View, I have a button.

When the user clicks this button, I want to have the ViewModel save the context of the TextBlock in the database.



        
相关标签:
5条回答
  • 2021-02-02 18:31

    In your VM:

    private DelegateCommand<string> _saveCmd = new DelegateCommand<string>(Save);
    
    public ICommand SaveCmd{ get{ return _saveCmd } }
    
    public void Save(string s) {...}
    

    In you View, use CommandParameter like Matt's example.

    0 讨论(0)
  • 2021-02-02 18:33

    You're asking about passing data via the button Command.

    What you actually want, I think, is to bind your Textbox's text to a public property in your ViewModel:

    <!-- View: TextBox's text is bound to the FirstName property in your ViewModel -->
    <TextBox Text="{Binding Path=FirstName}" />
    <Button Command="{Binding SaveCommand}"/>
    
    <!-- ViewModel: Expose a property for the TextBox to bind to -->
    public string FirstName{ get; set; }
    ...
    private void Save()
    {
        //textBox's text is bound to --> this.FirstName;
    }
    
    0 讨论(0)
  • 2021-02-02 18:43

    I'm not allowed to make comments yet, I guess. I'm responding to Carlos' suggestion because I tried it out. While it's a great idea, DelegateCommand would need to be modified in some way because otherwise you'll get this error: A field initializer cannot reference the non-static field, method, or property 'MyViewModel.Save(string)'.

    0 讨论(0)
  • 2021-02-02 18:44

    here is the elegant way.

    Give a name to your textbox, then bind the CommandParameter in the button to it's Text property:

    <StackPanel HorizontalAlignment="Left" VerticalAlignment="Top">
        <TextBlock Text="{Binding FirstName}"/>
        <TextBox x:Name="ParameterText" Text="Save this text to the database."/>
        <Button Content="Save" Command="{Binding SaveCommand}"
                CommandParameter="{Binding Text, ElementName=ParameterText}"/>
    </StackPanel>
    
    0 讨论(0)
  • 2021-02-02 18:45

    Check out this MSDN article by Josh Smith. In it, he shows a variation of DelegateCommand that he calls RelayCommand, and the Execute and CanExecute delegates on RelayCommand accept a single parameter of type object.

    Using RelayCommand you can pass information to the delegates via a CommandParameter:

    <Button Command="{Binding SaveCommand}" 
            CommandParameter="{Binding SelectedItem,Element=listBox1}" />
    

    Update

    Looking at this article, it appears that there is a generic version of DelegateCommand which accepts a parameter in a similar way. You might want to try changing your SaveCommand to a DelegateCommand<MyObject> and change your Save and CanSave methods so that they take a MyObject parameter.

    0 讨论(0)
提交回复
热议问题