我需要有关绑定模式的帮助。
<Image Source="{Binding Icon,Mode=OneTime}"/>
如果Mode=OneTime
图标永远不会出现;线程输入一次。
但是,如果Mode=OneWay
,则会出现图标,但线程会启动两次,
private ImageSource icon;
public ImageSource Icon
{
get
{
if ((icon == null) )
{
var thread = new System.Threading.Thread(() =>
{
ImageSource source = cIcon.GetImage(fullPath);
Icon = source;
});
thread.IsBackground = true;
thread.SetApartmentState(System.Threading.ApartmentState.STA);
thread.Start();
}
return icon;
}
set
{
if (icon != value)
icon = value; OnPropertyChanged("Icon");
}
}
这是ObservableCollection的一部分,它链接到Listbox
答案 0 :(得分:1)
如果您使用OneTime
,则get
被称为一次,然后您启动该线程,它将返回null。
你的OneTime
用完了,结束了。有一次是一次。不是&#34;一次,然后如果它发生变化,再次再次&#34;
由于你告诉它只获取一次事物,而且从不听取属性更改,所以没有任何东西正在追踪稍后发生的属性更改事件。
编写代码的方式,线程可以启动两次(或更多),因为你没有任何东西可以防范它。如果在有人再次调用getter之前第一个线程还没有完成,那么你将获得另一个线程。你真的需要另一个线程来加载该图像吗?你可能最好使用async / await而不是新线程。
此外,无论值是否发生变化,你的setter 总是触发OnPropertyChanged,因为
if (icon != value)
icon = value; OnPropertyChanged("Icon");
与
不同if (icon != value)
{
icon = value;
OnPropertyChanged("Icon");
}