在 Caliburn Micro 中将 属性 从 运行 线程设置为 ViewModel

set property from running thread to ViewModel in Caliburn Micro

我是 Caliburn.Micro 的初学者,所以如果有什么不清楚或此实现有误,请告诉我。我有一个 DataGridViewModel 属性 Name, Data

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 属性 FitnessGenerationCout。在 MainView 中有一个按钮可以启动我的 Genetic class.

的新线程
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;
    }

}

bestgenerationCount 等字段。并且有一个方法 SetActual() 在这个 class 的 运行 线程中使用。在我设置实际字段值的方法中,我想将它发送到 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++;
    }
}

所以我需要在线程期间在我的视图中显示这些字段的实际值是 运行。谁能告诉我如何使用正确的方法做到这一点?

您可以通过扩展 PropertyChangedBase 轻松地从 Genetic class 本身通知 Genetic 的属性更改,并直接从您的 ViewModel 公开它然后参考 Genetic class 属性 在 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,您可以将 INotifyPropertyChangedExINotifyPropertyChanged 的 caliburn 微型版本)实现为 https://github.com/Caliburn-Micro/Caliburn.Micro/blob/master/src/Caliburn.Micro/PropertyChangedBase.cs

有关约定的更多信息,请参阅 All about Conventions