Как я передаю информацию от Представления до ViewModel с DelegateCommand?

Приведенные выше примеры мне не очень помогли. Мое решение для XCode 6.4., Swift 1.2, и вы можете скопировать и вставить этот код в тестовый проект, чтобы почувствовать, как он работает:

РЕШЕНИЕ 1 - Swift 1.2:

import UIKit

let ALERT_TITLE   = "Got you working, right?"
let ALERT_MESSAGE = "Well maybe..."

class ViewController: UIViewController
{
    private var alert: UIAlertController!

    private var presentAlertButton: UIButton!

    override func viewDidAppear(animated: Bool)
    {
        /*
        // QUICK TEST - 1
        self.presentViewController(alert, animated: true, completion: nil)
        */


        // QUCIK TEST - 2
        /*
        let rootVC = UIApplication.sharedApplication().keyWindow?.rootViewController
        rootVC?.presentViewController(alert, animated: true, completion: nil)
        */
    }

    override func viewDidLoad()
    {
        super.viewDidLoad()

        createAndAddAlertV()

        createAndAddAlertButton()
    }

    private func createAndAddAlertV()
    {
        alert = UIAlertController(title:ALERT_TITLE, message:ALERT_MESSAGE, preferredStyle: .Alert)
        let alertAction = UIAlertAction(title: "OK", style: .Default, handler: nil)
        alert.addAction(alertAction)
    }

    private func createAndAddAlertButton()
    {
        presentAlertButton = UIButton(frame: CGRectMake(
            view.frame.size.width / 2,
            view.frame.size.height / 2,
            200,
            100))

        presentAlertButton.layer.anchorPoint = CGPointMake(1.0, 1.0)
        presentAlertButton.backgroundColor = UIColor.redColor()
        presentAlertButton.setTitle("Click For Alert", forState: .Normal)
        presentAlertButton.addTarget(self, action: "showAlertV", forControlEvents: .TouchUpInside)
        self.view.addSubview(presentAlertButton)
    }

    @IBAction func showAlertV()
    {
        println(" Showing... ")
        self.presentViewController(alert, animated: true, completion: nil)
    }

}

Я проверил это решение в Xcode 7.0. Это сработало. Xcode сделал одно изменение. Я перекомпилировал это в Xcode 6.4 снова, и это работало. Изменения в Swift 2.0 должны быть незначительными, если они вообще существуют.

Надеюсь, это поможет;)

12
задан Edward Tanguay 28 May 2009 в 10:21
поделиться

4 ответа

Прочтите эту статью MSDN Джоша Смита . В нем он показывает вариант DelegateCommand, который он вызывает RelayCommand, а делегаты Execute и CanExecute в RelayCommand принимают один параметр типа object.

Используя RelayCommand, вы можете передавать информацию делегатам через CommandParameter:

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

Обновление

Глядя на эту статью , кажется, что существует общая версия DelegateCommand, которая принимает параметр аналогичным образом. Вы можете попробовать изменить SaveCommand на DelegateCommand и изменить методы Save и CanSave так, чтобы они принимали параметр MyObject.

19
ответ дан 2 December 2019 в 03:11
поделиться

В вашей виртуальной машине:

private DelegateCommand<string> _saveCmd = new DelegateCommand<string>(Save);

public ICommand SaveCmd{ get{ return _saveCmd } }

public void Save(string s) {...}

В вашем представлении используйте CommandParameter, как в примере Мэтта.

11
ответ дан 2 December 2019 в 03:11
поделиться

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;
}
5
ответ дан 2 December 2019 в 03:11
поделиться

Вот элегантный способ.

Дайте имя своему текстовому полю, затем привяжите CommandParameter в кнопке к его свойству Text:

<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>
13
ответ дан 2 December 2019 в 03:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: