无法执行绑定命令

Can't execute binding command

我有一个这样的按钮:

<Button Content="Gönder" HorizontalAlignment="Left" VerticalAlignment="Top" Width="75" Margin="932,23,0,0" Height="25" Command="{Binding Path=SetTeamList}" CommandParameter="{Binding ElementName=UrlBox, Path=Text}"/>

在虚拟机上,我有一个方法

public void SetTeamList(string Url)
{
    //Some things here
}

解决方案是 WinForms 应用程序,所以我这样设置 DataContext:

var view = new dTeamMapperForm();
view.DataContext = new TeamMappingVM();
elementHost1.Child = view;

单击按钮时没有任何反应,没有错误或其他问题。我将断点放在 SetTeamList 方法上,但它没有在单击按钮时执行。

编辑:我已经更改了整个虚拟机,现在看起来像:

class TeamMappingVM : INotifyPropertyChanged
    {
        public ObservableCollection<Team> TeamList { get; set; }
        public ICommand SetTeamsCommand { get; internal set; }
        private string _url;

        public string Url
        {
            get { return _url; }
            set
            {
                _url = value;
                NotifyPropertyChanged("Url");
            }
        }


        public void SetTeamList()
        {
            var mapper = new TeamMapper();
            TeamList = new ObservableCollection<Team>(mapper.MapTeams(Url));
        }

        public bool CanParseTeams()
        {
            return !string.IsNullOrEmpty(Url);
        }

        public TeamMappingVM()
        {
            SetTeamsCommand = new RelayCommand(SetTeamList, CanParseTeams);
        }

        public event PropertyChangedEventHandler PropertyChanged;
        protected void NotifyPropertyChanged(String info)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(info));
            }
        }
    }

正如 Xeun 所指出的,Command 不是方法,而是实现 ICommand 接口的对象。命令实现如下所示:

class MyCommand: ICommand
{
  public bool CanExecute(object parameter)
  {
    return true; // if your command is "enabled" otherwhise return false
  }

  public void Execute(object parameter)
  {
    // do something usefull
  }
}

在此示例中,您应该将 MyCommand 的实例添加到您的 ViewModel 中 绑定到它。

请注意,通常您不会以这种方式编写命令。

命令通常与您的 ViewModel 交互(即它调用模型方法)并且在 MyCommand 中您没有对托管它的 ViewModel 的引用。 (您可以创建一个 Command,其中包含对其 ViewModel 的引用,但是......)通常在 ViewModel 中,您使用 Relay command or a Delegate command(它们基本上是同一件事)。

按钮的 Command-属性 希望您绑定到 ICommand 类型的 属性。

在您的案例中,您尝试绑定到一个无效的方法。 既然你编辑了你 post 我就 post 这个作为答案:

XAML:

<Button Content="Gönder" HorizontalAlignment="Left" VerticalAlignment="Top" Width="75" Margin="932,23,0,0" Height="25" Command="{Binding Path=SetTeamsCommand }" CommandParameter="{Binding ElementName=UrlBox, Path=Text}"/>


class TeamMappingVM : INotifyPropertyChanged
{
    public ObservableCollection<Team> TeamList { get; set; }
    public ICommand SetTeamsCommand { get; internal set; }
    private string _url;

    public string Url
    {
        get { return _url; }
        set
        {
            _url = value;
            NotifyPropertyChanged("Url");
        }
    }


    public void SetTeamList()
    {
        var mapper = new TeamMapper();
        TeamList = new ObservableCollection<Team>(mapper.MapTeams(Url));
    }

    public bool CanParseTeams()
    {
        return !string.IsNullOrEmpty(Url);
    }

    public TeamMappingVM()
    {
        SetTeamsCommand = new RelayCommand(SetTeamList, CanParseTeams);
    }

    public event PropertyChangedEventHandler PropertyChanged;
    protected void NotifyPropertyChanged(String info)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(info));
        }
    }
}

作为次要旁注。哪个没有被问到。由于您可能正在为 URL 文本框使用数据绑定,因此您不需要通过 CommandParameter 将其传递到方法中,因为 ViewMODel 的 URL 属性 代表此文本框。您想尝试将视图与逻辑分开。这是一个很小的问题,可能不会有任何影响,但这是一个养成的坏习惯。