在模式OneTime中绑定不成功

时间:2014-03-26 18:42:25

标签: c# wpf multithreading

我需要有关绑定模式的帮助。

<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

1 个答案:

答案 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");
}