无法执行绑定命令

时间:2015-02-03 07:11:44

标签: c# wpf winforms

我有一个这样的按钮:

<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}"/>

在VM上,我有一个方法

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));
            }
        }
    }

2 个答案:

答案 0 :(得分:1)

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

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交互(即它调用Model方法),而在MyCommand中,您没有引用托管它的ViewModel。 (您可以创建一个包含对其ViewModel的引用的命令,但是......)通常在ViewModel中使用Relay commandDelegate command(基本上是相同的东西)。

答案 1 :(得分:1)

Button的Command-Property要求绑定到ICommand类型的属性。

在你的情况下,你试图绑定到一个无法正常工作的方法。 由于您编辑了帖子,我将发布此答案:

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属性表示此文本框。您想尝试从逻辑中分离视图。这是一个非常小的问题,可能没有任何影响,但这是一个不好的习惯。