C# Wpf中的中继命令
我是c#新手,试图了解命令在mvvm体系结构中是如何工作的。我需要做的是当我点击一个按钮时更新一些信息。我认为我很好地实现了中继类,但根本没有更新 RelayCommand.csC# Wpf中的中继命令,c#,wpf,mvvm,C#,Wpf,Mvvm,我是c#新手,试图了解命令在mvvm体系结构中是如何工作的。我需要做的是当我点击一个按钮时更新一些信息。我认为我很好地实现了中继类,但根本没有更新 RelayCommand.cs public class RelayCommand : ICommand { private Action<object> execute; private Func<object, bool> canExecute; public event EventHandler
public class RelayCommand : ICommand
{
private Action<object> execute;
private Func<object, bool> canExecute;
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
public RelayCommand(Action<object> execute, Func<object, bool> canExecute)
{
this.execute = execute;
this.canExecute = canExecute;
}
public bool CanExecute(object parameter)
{
return this.canExecute == null || this.canExecute(parameter);
}
public void Execute(object parameter)
{
this.execute(parameter);
}
}
class MovieViewModel : INotifyPropertyChanged
{
Movie _movie;
private ICommand _updateCommand;
public event PropertyChangedEventHandler PropertyChanged;
public MovieViewModel()
{
_movie = new Movie
{
Title = "Unknown",
Genre = "Unknown",
Price = 11.0,
Score = 0
};
}
public Movie Movie
{
get
{
return _movie;
}
set
{
_movie = value;
}
}
public string Title
{
get
{
return Movie.Title;
}
set
{
Movie.Title = value;
RaisePropertyChanged("Title");
}
}
public string Genre
{
get
{
return Movie.Genre;
}
set
{
Movie.Genre = value;
RaisePropertyChanged("Genre");
}
}
public double Price
{
get
{
return Movie.Price;
}
set
{
Movie.Price = value;
RaisePropertyChanged("Price");
}
}
public double Score
{
get
{
return Movie.Score;
}
set
{
Movie.Score = value;
RaisePropertyChanged("Score");
}
}
private void RaisePropertyChanged(string name)
{
PropertyChanged(this, new PropertyChangedEventArgs(name));
}
public ICommand UpdateCommand
{
get
{
if (_updateCommand == null)
{
_updateCommand = new RelayCommand(p => { updateMovie("ASD", "ZXC", 11.90, 0); }, p => true);
}
return _updateCommand;
}
set
{
_updateCommand = value;
}
}
public Movie updateMovie(string title, string genre, double price, double score)
{
_movie.Title = title;
_movie.Genre = genre;
_movie.Price = price;
_movie.Score = score;
return _movie;
}
}
按钮命令绑定
<Button x:Name="updateBtn" Content="Update" Grid.Column="1" Grid.Row="5" Width="75" Height="30" Command="{Binding UpdateCommand}"/>
尝试给予
RaisePropertyChanged("Movie");
谢谢@Maverik也给出了理由陈述。您没有引发PropertyChanged
事件,因为您绕过了属性并直接访问底层字段。你应该像预期的那样使用虚拟机
通过VM访问模型的权限适用于您,就像它适用于视图和其他绑定到您VM的客户端一样。请指定哪些内容实际上不更新,其中只有变量;标题、流派、价格和分数这些都没有在互动媒体中更新吗?请检查绑定错误。为什么
\u movie.Title
您可以设置为您的公共电影
而不是私有变量,它们正在使用INotifyPropertyChanged
进行更新,据我所知,没有绑定错误。当我使用RelayCommand
@时,它们没有更新。埃尔霍已经指出了问题所在。您没有引发PropertyChanged事件,因为您绕过了属性并直接访问基础字段。你应该像预期的那样使用虚拟机。通过VM对模型的访问适用于您,就像它适用于视图和其他绑定到您VM的客户端一样。在WPF聊天室中,我告诉他只通过属性而不是字段访问数据,因为这是正确的操作方式,但这也行得通:)您可能希望提出同样的建议(就像通过属性访问一样)@Maverik请补充这一点作为答案,这样将来一些人会受益不,这不值得作为一个竞争性的答案。如果你还没有提到属性更改不被调用的核心问题,我可能已经做了。但是上面的评论对于未来的访问者来说应该足够了。