【问题标题】:Multiple parameters with Command binding具有命令绑定的多个参数
【发布时间】:2011-09-02 14:30:13
【问题描述】:

我有一个带有命令绑定和使用 Prism 库的文本块。

这是 XAML 部分:

<TextBlock Margin="0,10,0,0">SocialSecurityNumer:</TextBlock>
<TextBox Name="SSNText" GotFocus="TextBox_GotFocus" Text="{Binding SSN, UpdateSourceTrigger=PropertyChanged}" Margin="0,3,0,0"/>

这是背后的 ViewModel:

public FindViewModel()
{
    var eventAggregator = ServiceLocator.Current.GetInstance<IEventAggregator>();

    FindCommand = new DelegateCommand(
        () => eventAggregator.GetEvent<SSNChangedEvent>().Publish(SSN),
        () => !string.IsNullOrWhiteSpace(Kennitala)
        );
}

public DelegateCommand FindCommand { get; set; }

private string ssn;
public string SSN
{
    get { return ssn; }
    set
    {
        if (ssn== value)
            return;

        ssn = value;
        RaisePropertyChanged(() => SSN);
        FindCommand.RaiseCanExecuteChanged();
    }
}

这是侦听此事件触发器并以 SSN 作为参数启动函数的 GridViewModel

public class GridViewModel : NotificationObject
{
    public GridViewModel()
    {
        var eventAggregator = ServiceLocator.Current.GetInstance<IEventAggregator>();
        eventAggregator.GetEvent<SSNChangedEvent>().Subscribe(GetData);
    }

    public ObservableCollection<Investment> Investments { get; set; }

    private void GetData(string ssn)
    {
        var list = GeniusConnection.GetDataFromWebService(ssn);

        Investments = new ObservableCollection<Investment>(list);

        RaisePropertyChanged(() => Investment);
    }
}

如何添加另一个参数,例如 datetime 参数,让我感到困惑的部分是:

FindCommand = new DelegateCommand(
            () => eventAggregator.GetEvent<SSNChangedEvent>().Publish(SSN),
            () => !string.IsNullOrWhiteSpace(Kennitala)
            );

这个发布功能只需要一个参数,因此我不明白如何轻松添加多个参数。??

【问题讨论】:

  • 请阅读editing help并确保下次正确格式化您的代码。
  • 格式有问题吗?
  • 好吧,现在没有了,但是有...

标签: c# wpf xaml prism commandbinding


【解决方案1】:

您应该创建一个包含您要发布的所有必要参数的类。

 public class SSNChangedEventParams
 {
     public string SSN{get;set;}
     public DateTime Dt{get;set;}
     ...
 }

然后发布这个类的一个实例:

 eventAggregator.GetEvent<SSNChangedEvent>().Publish(new SSNChangedEventParams(){SSN=SSN, Dt = DateTime.Now})

【讨论】:

  • @agh 您的参数可以是您想要的任何参数,因此按照此答案中的建议,创建一个包含您需要的参数的容器类并将其传递给构造函数。有几次,我什至在命令参数中传递了整个 ViewModel!
  • 嗨,问个简单的问题。来自参数 DT 的值始终是 Date = {1.1.0001 00:00:00} ,但我在 datepicker 中选择了另一个日期
  • @agh:这是 DateTime 的默认值,如果您对此有疑问,请发布另一个问题。
  • 那个类可以是泛型类吗?我去订阅的时候试过了,它不会让我使用类型参数。 (不可能为每种类型定义订阅)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-20
  • 2017-09-05
  • 1970-01-01
  • 2017-08-08
  • 2021-09-24
  • 2023-04-06
  • 2013-03-06
相关资源
最近更新 更多