无法执行绑定命令
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 属性 代表此文本框。您想尝试将视图与逻辑分开。这是一个很小的问题,可能不会有任何影响,但这是一个养成的坏习惯。
我有一个这样的按钮:
<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 属性 代表此文本框。您想尝试将视图与逻辑分开。这是一个很小的问题,可能不会有任何影响,但这是一个养成的坏习惯。