Приведенные выше примеры мне не очень помогли. Мое решение для 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 должны быть незначительными, если они вообще существуют.
Надеюсь, это поможет;)
Прочтите эту статью MSDN Джоша Смита . В нем он показывает вариант DelegateCommand, который он вызывает RelayCommand, а делегаты Execute и CanExecute в RelayCommand принимают один параметр типа object.
Используя RelayCommand, вы можете передавать информацию делегатам через CommandParameter:
<Button Command="{Binding SaveCommand}"
CommandParameter="{Binding SelectedItem,Element=listBox1}" />
Обновление
Глядя на эту статью , кажется, что существует общая версия DelegateCommand, которая принимает параметр аналогичным образом. Вы можете попробовать изменить SaveCommand на DelegateCommand
и изменить методы Save и CanSave так, чтобы они принимали параметр MyObject.
В вашей виртуальной машине:
private DelegateCommand<string> _saveCmd = new DelegateCommand<string>(Save);
public ICommand SaveCmd{ get{ return _saveCmd } }
public void Save(string s) {...}
В вашем представлении используйте CommandParameter, как в примере Мэтта.
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;
}
Вот элегантный способ.
Дайте имя своему текстовому полю, затем привяжите 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>