(1) Предупреждение состоит в том, что classes_probs
может быть неопределенным в этой точке. Если tags
пусто, первый цикл не выполняется. Вы можете «исправить» это, назначив пустой список перед первым циклом.
(2) Это называется list comprehension
. Используйте этот поисковый термин и найдите учебное пособие на предпочитаемом вами уровне написания и примеров.
Это мой метод для извлечения выбранного значения для комбинированного списка, как я могу сказать делегировать возвращаемое значение?
private object getValueCB(System.Windows.Controls.ComboBox cb)
{
object obj;
if (!cb.Dispatcher.CheckAccess())
{
obj = cb.Dispatcher.Invoke(
System.Windows.Threading.DispatcherPriority.Normal,
new Action(
delegate()
{
obj = cb.SelectedValue;
}
));
return obj;
}
else
{
return obj = cb.SelectedValue;
}
}
Я решил это. Решение состоит в том, чтобы создать пользовательский делегат, который возвращает желаемый тип, подобный этому:
private object GetValueCB(System.Windows.Controls.ComboBox cb)
{
object obj = null;
if (!cb.Dispatcher.CheckAccess())
{
obj = cb.Dispatcher.Invoke(
System.Windows.Threading.DispatcherPriority.Normal,
(MyDelegate)
delegate()
{
return (obj = cb.SelectedValue);
}
);
return obj;
}
else
{
return obj = cb.SelectedValue;
}
}
public delegate object MyDelegate();
int result = -1;
// this is synchronous
myCombo.Invoke(() =>
{
result = myCombo.SelectedIndex;
});
return result;
Это, конечно, неуклюже. Лучше всего реализовать INotifyPropertyChanged в вашей виртуальной машине, создать свойство SelectedIndex и привязать к нему свойство SelectedIndex
поля со списком. Привязки INPC нечувствительны к потокам (3.5 или 4.0+, я не помню, какие именно), поэтому вы можете без проблем читать и обновлять эти свойства из разных потоков в вашей виртуальной машине.
Вы не можете сделать это напрямую, но можете.
Dispatcher.Invoke () фактически возвращает возвращаемое значение от вызываемого делегата, поэтому измените свой делегат соответствующим образом.
Возвращаемое значение
Тип: System.Object Возвращаемое значение от вызываемого делегата или null, если делегат не имеет возвращаемого значения .