2017-03-03 192 views
1

我的应用程序有问题,特别是WPF MVVM中的绑定。 我创建了模型,视图模型和视图,这是我的代码的一部分(只有这与我的问题有关)当我点击按钮nemed:PointUp我想看看Team1点的数量。任何人都可以告诉我我做错了什么?WPF - MVVM绑定

查看

<Window x:Class="Tabu.Game 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:local="clr-namespace:Tabu" 
     xmlns:vm="clr-namespace:Tabu.ViewModel" 
     mc:Ignorable="d" 
     Title="Game" Height="600" Width="900" Background="Beige"> 
    <Window.DataContext> 
     <vm:TeamStatistic /> 
    </Window.DataContext> 
    <Grid> 
     <Button x:Name="PointUp" Command="{Binding AddPoints }" Content="+"/> 
     <Label x:Name="PointsTeam1_label" Content="{Binding Team1.TeamPoints, UpdateSourceTrigger=PropertyChanged }"/> 
</Grid> 

型号

'

namespace Tabu.Model 
{ 
    public class Team 
    { 
     public bool IsTeamActive { get; set; } 
     public int TeamMiss { get; set; } 
     public int TeamPoints { get; set; } 
     public int TeamMistake { get; set; } 
    } 
}
'

视图模型

namespace Tabu.ViewModel 
{ 
    class TeamStatistic : INotifyPropertyChanged 

    { 
     public Team Team1 = new Team(); 

     public int TeamPoints 
     { 
      get { return TeamPoints; } 
      set { TeamPoints = value; OnPropertyChanged("TeamPoints"); } 
     } 

     public ICommand AddPoints 
     { 
      get { return new RelayCommand(() => Add_Points()); } 
     } 

     public void Add_Points() 
     { 
      Team1.TeamPoints++; 
     } 

     public event PropertyChangedEventHandler PropertyChanged; 

     private void OnPropertyChanged(params string[] propsName) 
     { 
      if (PropertyChanged!=null) 
      { 
       foreach(string propName in propsName) 
       PropertyChanged(this, new PropertyChangedEventArgs(propName)); 
      } 
     } 
    } 

public class RelayCommand : ICommand 
    { 
     private readonly Func<bool> canExecute; 
     private readonly Action execute; 

     public RelayCommand(Action execute) 
      : this(execute, null) { } 

     public RelayCommand(Action execute, Func<bool> canExecute) 
     { 
      if (execute == null) throw new ArgumentNullException("execute"); 
      this.execute = execute; 
      this.canExecute = canExecute; 
     } 

     public event EventHandler CanExecuteChanged 
     { 
      add { if (this.canExecute != null) CommandManager.RequerySuggested += value; } 
      remove { if (this.canExecute != null) CommandManager.RequerySuggested -= value; } 
     } 

     public Boolean CanExecute(object parameter) { return this.canExecute == null ? true : this.canExecute(); } 
     public void Execute(object parameter) { this.execute(); } 
    } 
} 

回答

1

你必须更新你的绑定这样。

<Label x:Name="PointsTeam1_label" Content="{Binding TeamPoints, UpdateSourceTrigger=PropertyChanged }"/> 

当您绑定到Team1.TeamPoints你不会得到OnPropertyChanged通知哪个是你的TeamPoints物业内。

+0

是的它的真实,我的错误:)它的工作原理,但只在开始时,点的数量仍然是相同的0。绑定不会刷新 – Arkady

+0

啊,好吧,我看到了问题。 您在AddTeamPoints方法中更新Team1.Teampoints,NotifyPropertyChanged将不会再次触发。 当你写OnPropertyChanged(“TeamPoints”);在Team1.TeamPoints ++之后;它会没事的。 –

+0

谢谢!我没有注意到。 – Arkady

2

的问题是在这里:

public int TeamPoints 
{ 
    get { return TeamPoints; } //should be Team1.TeamPoints 
    set { TeamPoints = value; OnPropertyChanged("TeamPoints"); } //should be Team1.TeamPoints 
} 

里面你TeamPoints财产ViewModel返回,并从ViewModel设置相同属性TeamPoints但你应该从ModelTeam1)设置。您应该返回并设置Team1.TeamPoints

public int TeamPoints 
{ 
    get { return Team1.TeamPoints; } 
    set { Team1.TeamPoints = value; OnPropertyChanged("TeamPoints"); } 
} 

而且Add_Points()

public void Add_Points() 
{ 
    Team1.TeamPoints++; 
    OnPropertyChanged("TeamPoints"); 
} 
+0

好的,谢谢但我仍然没有看到我的观点 – Arkady

0

我认为这是因为AddPoints(命令结合)的。由于此命令绑定了&,因此您正在创建一个RelayCommand实例,它每次可能会中断绑定时都会返回&。

CommandBindings更好的选择是声明属性并在视图模型的构造函数中初始化它们。

例:

namespace Tabu.ViewModel 
{ 
    class TeamStatistic : INotifyPropertyChanged 

    { 
    public Team Team1 = new Team(); 

    public int TeamPoints 
    { 
     get { return Team1.TeamPoints; } 
     set { Team1.TeamPoints = value; OnPropertyChanged("TeamPoints"); } 
    } 

    private ICommand _AddPoints; 

    public ICommand AddPoints 
    { 
     get { return _AddPoints; } 
     set { _AddPoints = value; } 
    } 

    public void Add_Points() 
    { 
     Team1.TeamPoints++; 
    } 

    public TeamStatistic() 
    { 
     _AddPoinss = new RelayCommand(Add_Points); 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    private void OnPropertyChanged(params string[] propsName) 
    { 
     if (PropertyChanged!=null) 
     { 
      foreach(string propName in propsName) 
      PropertyChanged(this, new PropertyChangedEventArgs(propName)); 
     } 
    } 
} 
+0

P.S:RelayCommand类保持不变。 – Ankit