在 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
属性 Fitness
和 GenerationCout
。在 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;
}
}
有 best
和 generationCount
等字段。并且有一个方法 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
,您可以将 INotifyPropertyChangedEx
(INotifyPropertyChanged
的 caliburn 微型版本)实现为 https://github.com/Caliburn-Micro/Caliburn.Micro/blob/master/src/Caliburn.Micro/PropertyChangedBase.cs
有关约定的更多信息,请参阅 All about Conventions
我是 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
属性 Fitness
和 GenerationCout
。在 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;
}
}
有 best
和 generationCount
等字段。并且有一个方法 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
,您可以将 INotifyPropertyChangedEx
(INotifyPropertyChanged
的 caliburn 微型版本)实现为 https://github.com/Caliburn-Micro/Caliburn.Micro/blob/master/src/Caliburn.Micro/PropertyChangedBase.cs
有关约定的更多信息,请参阅 All about Conventions