我目前有一个View(Android Fragment)和一个相应的ViewModel.我现在想在ViewModel中引发一个View可以订阅的事件.
存档的最佳方法是什么?我听说过常规的C#事件(委托)会导致内存泄漏吗?这是WeakSubscribe功能的原因吗?如何将其绑定到事件?
我有一个程序,它使用一个执行一些工作的线程.线程应通知进度的另一个线程(在本例中为主线程).
如果我使用Synchronize()来执行同步,一切都按预期工作.如果我与主线程同步并发布for-variable并将其放入列表中,则每个值都可以正确打印到我的ListBox中:
procedure TWorkerThread.Execute;
var
i: Integer;
begin
inherited;
for i := 1 to 1000 do
begin
Synchronize(
procedure()
begin
FireEvent(i);
end);
end;
end;
Run Code Online (Sandbox Code Playgroud)
输出:1,2,3,4,5 ...... 1000
如果我使用Queue()执行同步,则输出不符合预期:
procedure TWorkerThread.Execute;
var
i: Integer;
begin
inherited;
for i := 1 to 1000 do
begin
Queue(
procedure()
begin
FireEvent(i);
end);
end;
end;
Run Code Online (Sandbox Code Playgroud)
输出:200,339,562,934,1001,1001,1001,1001,1001,1001,1001,1001,1001,[...]
这里发生了什么事?据我所知,匿名程序应该捕获变量"i"?
我想编写一个打印文档的应用程序。
哪种设计会更好?变体A:
class Document
{
public string Title { get; set; }
public string Author { get; set; }
public string Content { get; set; }
// ...
}
class DocumentPrinter
{
public void PrintDocument(Document document)
{
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
这将提供一个专用的 DocumentPrinter 类,它只进行打印。或者最好将 Print() 方法添加到 Document 类本身,如下所示(变体 B):
public class Document
{
public string Title { get; set; }
public string Author { get; set; }
public string Content { get; set; }
public void Print()
{
// ... …Run Code Online (Sandbox Code Playgroud) 在使用mvvm方法的应用程序中,ViewModel提供一个或多个Command -properties 非常常见.这些属性通常具有ICommand或DelegateCommand类型或类似的类型.
我不明白为什么我们在mvvm应用程序中需要这样的方法.提供公共方法并将视图中的操作直接绑定到此公共方法是不够的?
为什么ICommand存在?
我有一个主线程(UI线程)和工作线程的应用程序.
主线程将一个大字符串传递给工作线程,然后工作线程根据传递的字符串执行一些工作.
在执行工作线程期间,可能会更改传递的字符串的内容.
有没有办法复制字符串(例如在工作线程的构造函数中)以避免可能的意外并改为处理该字符串副本?
copy()或UniqueString()可以做到吗?
我想在我的图表中选择一个保存的查询作为数据源,但 Superset 只将视图和表显示为数据源。
选择查询作为数据源需要什么?