2015-11-22 2 views
0

Я начинаю в Caliburn.Micro, поэтому, если что-то неясно или эта реализация неверна, сообщите мне. У меня есть DataGridViewModel со свойствами Name, Dataset property from running thread to ViewModel in Caliburn Micro

class DataGridViewModel : Screen 
{ 
    private char name; 

    public char Name 
    { 
     get { return name; } 
     set 
     { 
      name = value; 
      this.NotifyOfPropertyChange(() => Name); 
     } 
    } 

    private DataTable data; 
    public DataTable Data 
    { 
     get { return data; } 
     set 
     { 
      data = value; 
      this.NotifyOfPropertyChange(() => Data); 
     } 
    } 
} 

и MainViewModel со свойствами Fitness и GenerationCout. В MainView есть кнопка, которая запускает новый поток моего класса Genetic.

public class MainViewModel : Conductor<Screen>.Collection.AllActive 
{ 
    private Genetic genetic; 

    private double fitness; 
    public double Fitness 
    { 
     get { return fitness; } 
     set 
     { 
      fitness = value; 
      NotifyOfPropertyChange(() => Fitness); 
     } 
    } 

    private int generationCout; 
    public int GenerationCout 
    { 
     get { return generationCout; } 
     set 
     { 
      generationCout = value; 
      NotifyOfPropertyChange(() => GenerationCout); 
     } 
    } 
    public void Start() 
    { 
     List<string> features = new List<string> { "(a*b)*c=a*(b*c)" }; 
     genetic = new Genetic(features); 
     genetic.Start(); 
    } 

    public MainViewModel() 
    { 
     generationCout = 0; 
     fitness = 0; 
    } 

} 

Есть поля, такие как best и generationCount. И есть метод SetActual(), который используется в потоке этого класса. В методе я устанавливаю значение фактических полей, и я хочу отправить его в ViewModels, в конце концов обновив его в Views.

public class Genetic : BaseThread 
{ 
    private int generationCount; 
    private Subject best; 

    private void SetActual() 
    { 
     DataTable data; 
     char name; 
     double fitness; 
     foreach (Operation operation in best.Operations) 
     { 
      DataTable data; 
      data = Converter.ArrayToDataTable(operation); 
      name = operation.Name; 
      fitness = best.Fitness; 
     } 
     generationCount++; 
    } 
} 

Поэтому мне нужно показать фактическое значение этих полей в моих представлениях во время работы потока. Может ли кто-нибудь сказать мне, как это сделать, используя правильный подход?

ответ

0

Вы можете легко уведомить свойства генетических изменяются от самого генетического класса по простираться PropertyChangedBase и подвергать его непосредственно из ViewModel, то обратитесь к Genetic класса собственности на MainViweModel от контроля

public class MainViewModel : Conductor<Screen>.Collection.AllActive 
{ 
    private Genetic genetic; 

    public Genetic CurrentGenetic 
    { 
     get { return genetic; } 
     set 
     { 
      genetic = value; 
      NotifyOfPropertyChange(nameof(CurrentGenetic)); 
     } 
    } 
} 
public class Genetic : PropertyChangedBase 
{ 
    private int generationCount; 

    public int GenerationCout 
    { 
     get { return generationCount; } 
     set 
     { 
      generationCount = value; 
      NotifyOfPropertyChange(nameof(CurrentGenetic)); 
     } 
    } 
} 

// example binding 
<TextBlock Text="{Binding Path=CurrentGenetic.GenerationCout }" /> 
// or caliburn micro convention 
<TextBlock x:Name="CurrentGenetic_GenerationCout" /> 

, если вы не хотите, чтобы продлить PropertyChangedBase, вы можете реализовать INotifyPropertyChangedEx (Caliburn микро versioin из INotifyPropertyChanged), как https://github.com/Caliburn-Micro/Caliburn.Micro/blob/master/src/Caliburn.Micro/PropertyChangedBase.cs

больше о конвенциях см All about Conventions

+0

Спасибо, это очень полезно! И мне жаль, что я отвечаю поздно. – Vojta

Смежные вопросы