13

在我看来,我有一个按钮。

当用户单击此按钮时,我希望 ViewModel 将 TextBlock 的上下文保存在数据库中。

<StackPanel HorizontalAlignment="Left" VerticalAlignment="Top">
    <TextBlock Text="{Binding FirstName}"/>
    <TextBox Text="Save this text to the database."/>
    <Button Content="Save" Command="{Binding SaveCommand}"/>
</StackPanel>

但是,在我的 ViewModel 中的 DelegateCommand 中,“Save()”方法不传递任何参数,那么我该如何从视图中获取数据呢?

#region DelegateCommand: Save
private DelegateCommand saveCommand;

public ICommand SaveCommand
{
    get
    {
        if (saveCommand == null)
        {
            saveCommand = new DelegateCommand(Save, CanSave);
        }
        return saveCommand;
    }
}

private void Save()
{
    TextBox textBox = ......how do I get the value of the view's textbox from here?....
}

private bool CanSave()
{
    return true;
}
#endregion
4

5 回答 5

20

查看Josh Smith 的这篇 MSDN 文章。在其中,他展示了他称为 RelayCommand 的 DelegateCommand 的变体,并且 RelayCommand 上的 Execute 和 CanExecute 委托接受对象类型的单个参数。

使用 RelayCommand,您可以通过 CommandParameter 将信息传递给代表:

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

更新

查看这篇文章,似乎有一个通用版本的 DelegateCommand 以类似的方式接受参数。您可能想尝试将 SaveCommand 更改为 aDelegateCommand<MyObject>并更改 Save 和 CanSave 方法,以便它们采用 MyObject 参数。

于 2009-05-28T10:28:15.433 回答
13

这是优雅的方式。

为您的文本框命名,然后将按钮中的 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>
于 2009-09-03T15:13:46.833 回答
12

在您的虚拟机中:

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

public ICommand SaveCmd{ get{ return _saveCmd } }

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

在你的视图中,像马特的例子一样使用 CommandParameter。

于 2009-05-28T17:41:14.170 回答
5

您正在询问通过按钮命令传递数据。

我认为,您真正想要的是将文本框的文本绑定到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;
}
于 2009-05-28T17:59:25.710 回答
1

我想我还不允许发表评论。我正在回应 Carlos 的建议,因为我已经尝试过了。虽然这是一个好主意,但 DelegateCommand 需要以某种方式进行修改,否则您将收到此错误:字段初始值设定项无法引用非静态字段、方法或属性“MyViewModel.Save(string)”。

于 2010-09-14T14:28:19.133 回答