2017-03-27 5 views
0

私はこの質問を数回はしましたが、一度もそれを得ることはできませんでした。うまくいけば、誰かが私がプログラミングとC#を初めて勉強しているときに助けてくれるはずです。タスクメソッドを使用して、各タスク/行のDataGrid/listviewの行を更新します。

私は、このようなTask IDTask Statusなどいくつかの値でDatagrid(以前にリストビュー)を移入し、その後Task<List>Tasksを追加し、ボタンを持っています。各Taskには、と同じmethodが含まれており、対応するStatusをそのTask indexに更新するはずです。

以下を参照してください。

マイリストビュー:

namespace Something 
{ 
public class listView 
{ 
    private static ObservableCollection<listItems> _myList = new  ObservableCollection<listItems>(); 
    public static ObservableCollection<listItems> myList 
    { 
     get { return _myList; } 
    } 

    private static string _status; 

    public class listItems : INotifyPropertyChanged 
    { 
     public event PropertyChangedEventHandler PropertyChanged; 

     protected void OnPropertyChanged([System.Runtime.CompilerServices.CallerMemberName] string propertyName = "") 
     { 
      if (PropertyChanged != null) 
      { 
       PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
      } 
     } 

     public int id { get; set; } 

     public string status 
     { 
      get { return _status; } 
      set 
      { 
       if (_status != value) 
       { 
        _status = value; 
        OnPropertyChanged(); 
       } 
      } 
     } 
    } 
} 

マイmainWindow.xaml.cs

public MainWindow() 
    { 
     InitializeComponent(); 
     dataGrid.ItemsSource = listView.myList; 
    } 

    private void create_btn_Click(object sender, RoutedEventArgs e) 
    { 
     lvl.status = "Task ready to start"; 

     var repeat = int.Parse(taskNumber.Text); 
     addTasks(repeat); 

     run_btn.IsEnabled = true; 
     create_btn.IsEnabled = false; 
     taskNumber.IsEnabled = false; 
    } 

    private void run_btn_Click(object sender, RoutedEventArgs e) 
    { 
     foreach (var Task in myTasks) 
     { 
      Task.Start(); 
     } 
    } 

    public void addTasks(int repeatCount) 
    { 
     List<Task> myTasks = pTask.tasks(); 
     for (int i = 0; i < repeatCount; i++) 
     { 
      lvl.id++; 
      int x = lvl.id; 
      myTasks.Add(new Task(() => p.myAction(x))); 
      listView.myList.Add(new listView.listItems 
      { 
       id = lvl.id, 
       status = lvl.status, 
      }); 
     } 
    } 

、その後は、ここで更新する行STATUSを見つけることupdateStatusを呼び出す私のmethodです。

public static Action<int> myAction = x => doMethod(x); 

public static void doMethod(int rowIndex) 
    { 
     updateStatus(rowIndex, "testing"); 
    } 

public static void updateStatus(int row, string text) 
    { 
     listView.myList[row].status = text; 
    } 

私はXに渡されるvalueがそれぞれiterationを更新するために、私のdatagridにのみ最後の行を引き起こし更新取得されているので、これは動作していないと思われますか?

task methodrow indexがそれぞれtask indexに一致するように代替のオプションを教えてください。

おかげで

PS:私は自分が...あなたのlistViewクラスで

+0

静的である間に 'myAction'を' p'のインスタンスとしてどのように呼び出すのか分かりません。 –

+0

申し訳ありませんが、コードはうまくいきます。唯一の問題は、複数の「タスク」があり、それらをすべて同時に実行する場合です。 ** 1 **の行/ステータスのみが更新され、活発に変更されます。他の 'tasks'は更新されず、' variable'' 'X'が各繰り返しを更新しているためです。私は 'タスク'が 'X 'の'値 'をそのまま取り込んでいると思ったが、これはそうではないようだ。 – m00shii

答えて

0

をプログラミング/ C#に非常に新しいを教えていますように、あなたはprivate static string _status;

を持っている私に、それは簡単に各リストを取ってください。項目この静的フィールドへのアクセスとOnPropertyChangedは一度だけ発生した(statusプロパティ内if (_status != value)チェックを参照してください)

だから、プライベートフィールドを追加しよう〜listItemsクラス

+0

お寄せいただきありがとうございます。後で機会が得られたら、これを試してみましょう。 'private static string _status;'は 'static'を削除するべきだと確信していますか? 私はまだ考えている問題は、反復ごとに 'X'パラメータが更新され、最後の反復のみを対象としているということです。 – m00shii

+0

はい、 '_status'フィールドは' static'修飾子なしで 'listItems'クラスの中で動かなければなりません。 –

+0

そして、 'X'パラメタについては' Debug 'を追加することで確認できます。WriteLine(rowIndex) 'public static void doMethod(int rowIndex)'の中にあります。しかし、私はすべてのタスクが異なるXのパラメータを持っていると思います - この変数を**サイクル内に宣言しているので** –

関連する問題