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