2017-09-14 18 views
0

実行時にいくつかのプロパティの変更を表示できるようにしたいと思います。私はバインディングを学んでいますが、次の例は正常に動作しますが、実行時にバインドされたプロパティの変更を監視できるようにしたいと考えています。実行時にコンテンツを更新する

class Player : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    private string id; 
    public string ID { get => id; } 

    private int power; 
    public int Power 
    { 
     get => power; 
     set 
     { 
      if (this.power != value) 
      { 
       this.power = value; 
       if (this.PropertyChanged != null) 
        this.NotifyPropertyChanged("Power"); 
      } 
     } 
    } 


    public Player(string playerId) 
    { 
     id = playerId; 
     power = 50; 
    } 
} 

私はお互いに戦う選手、いくつかの数を作成して稼ぐか、力を失う:

は、私はクラスのプレーヤーを持っています。私はポリゴンを使用して、すべてのリストビュー内のプレイヤーIDは、パワーポイント、およびそれらの電力点の分布のヒストグラムを表示データバインディングを使用する:

public partial class MainWindow : Window, INotifyPropertyChanged 
    { 
     private static readonly Random random = new Random(); 

     public event PropertyChangedEventHandler PropertyChanged; 
     public void NotifyPropertyChanged(string propName) 
     { 
      if (this.PropertyChanged != null) 
       this.PropertyChanged(this, new PropertyChangedEventArgs(propName)); 
     } 

     private ObservableCollection<Player> players; 

     private PointCollection powerHistogramPoints; 
     public PointCollection PowerHistogramPoints 
     { 
      get => this.powerHistogramPoints; 
      set 
      { 
       if (this.powerHistogramPoints != value) 
       { 
        this.powerHistogramPoints = value; 
        if (this.PropertyChanged != null) this.NotifyPropertyChanged("PowerHistogramPoints"); 
       } 
      } 
     } 

     public MainWindow() 
     { 
      InitializeComponent(); 
      this.DataContext = this; 

      players = new ObservableCollection<Player> { }; 
      for (int i = 1; i < 10; i++) players.Add(new Player("player" + i.ToString("D3"))); 
      popListView.ItemsSource = players; 
      CreateHistogram(); 
     } 

     private void runButton_Click(object sender, RoutedEventArgs e) 
     { 
      RunEpochs(Int32.Parse(nEpochsTextBox.Text)); 
      CreateHistogram(); 
     } 

     private int[] CreateHistogram(...){...} 

     internal void RunEpochs(int nEpochs) 
     {for (int i = 0; i < nEpochs; i++) RunEpoch();} 
     private void RunEpoch(){...} 
    } 

とXAMLコードは次のとおりです。

 <ListView Margin="2" Name="popListView"> 
      <ListView.View> 
       <GridView> 
        <GridViewColumn Header="player ID" Width="120" DisplayMemberBinding="{Binding ID}" /> 
        <GridViewColumn Header="power" Width="50" DisplayMemberBinding="{Binding Power}" /> 
       </GridView> 
      </ListView.View> 
     </ListView> 

  <GroupBox Height="200" Width="300" Header="Power Distribution" BorderThickness="0"> 
       <Border BorderThickness="1" BorderBrush="Black" Background="White" Margin="4"> 
        <Polygon Points="{Binding PowerHistogramPoints}" Stretch="Fill" Fill="Black" Opacity="0.8" /> 
       </Border> 
      </GroupBox> 

実行するエポックの数を選択できるコントロールがあり、実行後にリストビューとヒストグラムがうまく更新されます。しかし、私は100万エポックを走り、プレイヤーポイントとヒストグラムの変化をリアルタイムで監視できるようにしたいと考えています(例えばリストとグラフを1000エポックごと、または毎秒更新するなど)。 ..)私は上記のコードに何が変わるでしょうか?

助けていただけたら幸いです!

答えて

0

あなたは、プロパティのセッターから

をNotifyPropertyChangedへの呼び出しを削除し、あなたのタイマーがあなたのセット経過時間をヒットした後、手動でそれらを呼び出すことができます。

Timerは、バックグラウンドの作業スレッド内にあり、Dispatcher.BeginInvokeブロック内のすべての通知を行います。

関連する問題