Привязка в режиме 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 ответ

Если вы используете OneTime, get получает вызов один раз, затем вы начинаете поток, и он возвращает null.

ваш OneTime, конец. Один раз один раз. Не "один раз, а потом, если он изменится, получите его еще раз"

Ничто не подслушивает событие с измененным свойством, которое происходит позже, так как вы сказали ему, чтобы получить только одно, и никогда не слушать изменения свойств.

Как ваш код будет написан, поток может начинаться дважды (или больше), потому что вам нечего защищать. если первый поток еще не закончен, прежде чем кто-то снова вызовет геттер, вы получите еще один поток. Вам действительно нужен другой поток для загрузки этого изображения? вам может быть лучше использовать async/wait вместо новых потоков.

Кроме того, ваш сеттер всегда запускает OnPropertyChanged, независимо от того, изменяется ли значение, потому что

if (icon != value)
 icon = value; OnPropertyChanged("Icon");

это не то же самое, что

if (icon != value)
{
 icon = value; 
 OnPropertyChanged("Icon");
}

licensed under cc by-sa 3.0 with attribution.