C# Wpf中的中继命令

C# 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

我是c#新手,试图了解命令在mvvm体系结构中是如何工作的。我需要做的是当我点击一个按钮时更新一些信息。我认为我很好地实现了中继类,但根本没有更新

RelayCommand.cs

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请补充这一点作为答案,这样将来一些人会受益不,这不值得作为一个竞争性的答案。如果你还没有提到属性更改不被调用的核心问题,我可能已经做了。但是上面的评论对于未来的访问者来说应该足够了。