Re: Забиндить на результат асихронной операции
От: Qulac Россия  
Дата: 04.09.16 10:55
Оценка: 14 (2)
Здравствуйте, ylem, Вы писали:

Y>WPF.

Y>Хочется забиндить элементы UI в WPF на результаты асинхронной операции.
Y>Типа, чтобы забиндил, UI не заблокировался, а когда операция выполнилась, значения в контролах появились.
Y>В идеале хочется, чтобы операция возвращала сложную структуру (класс), и несколько контролов биндились на разные свойства этого класса.
Y>Ко всему этому хочется простой способ отобразить в UI, что, типа еще считается (с анимацией если совсем просто, или без).

Y>Есть какой-нибудь более или менее конвеншенал способ это делать?


Y>Первое, что приходит в голову, это объект из ViewModel создать "сразу", а когда данные появятся пусть объект кидает PropertyChanged.

Y>Еще нагуглил вот, но не уверен, на сколько это можно тащить в продашкен-код.

1. Делаем в viewModel свойство типа object — это свойство будет устанавливаться стразу перед началом длительной операции.
2. Делаем два шаблона данных, один — для типа object, второй для вашей сложной структуры в виде класса. Первый шаблон будет показываться во время выполнения операции, что типа прогрес-полосы, тут ваша фантазия, второй — отображать вашу структуры данных.
3. В форму добавляем Label, биндим контент Label на свойство viewModel и указываем шаблоны данных.

Работает это все так: viewModel сразу возвращает пустой объект, затем после выполнения объект нужного класса, в label автоматом в зависимости от типа будет подставляться нужный шаблон с контролами.
Программа – это мысли спрессованные в код
Отредактировано 04.09.2016 11:13 Qulac . Предыдущая версия . Еще …
Отредактировано 04.09.2016 11:13 Qulac . Предыдущая версия .
Re[3]: Забиндить на результат асихронной операции
От: okon  
Дата: 05.09.16 08:46
Оценка: 4 (1)
Здравствуйте, ylem, Вы писали:

Q>>Работает это все так: viewModel сразу возвращает пустой объект, затем после выполнения объект нужного класса, в label автоматом в зависимости от типа будет подставляться нужный шаблон с контролами.


Y>Спасибо!

Y>можно еще вопрос?
Y>ViewModel одним из свойств должен "показывать" картинку. Было в планах просто возвращать System.Drawing.Image из ресурсов (Proeprties.Resources),
Y>но вот как простым и лаконичным образом это свойство прибиндить к System.Windows.Controls.Image я так и не нашел. Для начала из C# а не из XAML-шаблона.

Y>Я вообще все неправильно делаю?


Можно ввести свойство типа State и через DataTrigger менять у Image свойство Source, в зависимости от State
<DataTrigger Binding="{Binding State}"  Value="0">
  <Setter Property="Source" Value="{StaticResource ImageState1} />
</DataTrigger>



Если шаблоны для разных состояний сильно отличаются то лучше использовать разные типы состояний и шаблоны привязывать к типу

public class State1
{
}

public class State2
{
}


public class ViewModel
{
   public object State {get...;set...;}
}


<DataTemplate DataType="State1">
</DataTemplate>


<DataTemplate DataType="State2">
</DataTemplate>

// Соотвественно тут будет автоматом выбираться шаблон по типу который присвоен State
<ContentControl Content="{Binding State}" />
”Жить стало лучше... но противнее. Люди которые ставят точку после слова лучше становятся сторонниками Путина, наши же сторонники делают акцент на слове противнее ( ложь, воровство, лицемерие, вражда )." (с) Борис Немцов
Забиндить на результат асихронной операции
От: ylem  
Дата: 04.09.16 10:26
Оценка:
WPF.
Хочется забиндить элементы UI в WPF на результаты асинхронной операции.
Типа, чтобы забиндил, UI не заблокировался, а когда операция выполнилась, значения в контролах появились.
В идеале хочется, чтобы операция возвращала сложную структуру (класс), и несколько контролов биндились на разные свойства этого класса.
Ко всему этому хочется простой способ отобразить в UI, что, типа еще считается (с анимацией если совсем просто, или без).

Есть какой-нибудь более или менее конвеншенал способ это делать?

Первое, что приходит в голову, это объект из ViewModel создать "сразу", а когда данные появятся пусть объект кидает PropertyChanged.
Еще нагуглил вот, но не уверен, на сколько это можно тащить в продашкен-код.
Re[2]: Забиндить на результат асихронной операции
От: ylem  
Дата: 04.09.16 15:33
Оценка:
Q>Работает это все так: viewModel сразу возвращает пустой объект, затем после выполнения объект нужного класса, в label автоматом в зависимости от типа будет подставляться нужный шаблон с контролами.

Спасибо!
можно еще вопрос?
ViewModel одним из свойств должен "показывать" картинку. Было в планах просто возвращать System.Drawing.Image из ресурсов (Proeprties.Resources),
но вот как простым и лаконичным образом это свойство прибиндить к System.Windows.Controls.Image я так и не нашел. Для начала из C# а не из XAML-шаблона.

Я вообще все неправильно делаю?
Отредактировано 04.09.2016 15:34 ylem . Предыдущая версия .
Re[3]: Забиндить на результат асихронной операции
От: Qulac Россия  
Дата: 04.09.16 16:18
Оценка:
Здравствуйте, ylem, Вы писали:

Q>>Работает это все так: viewModel сразу возвращает пустой объект, затем после выполнения объект нужного класса, в label автоматом в зависимости от типа будет подставляться нужный шаблон с контролами.


Y>Спасибо!

Y>можно еще вопрос?
Y>ViewModel одним из свойств должен "показывать" картинку. Было в планах просто возвращать System.Drawing.Image из ресурсов (Proeprties.Resources),
Y>но вот как простым и лаконичным образом это свойство прибиндить к System.Windows.Controls.Image я так и не нашел. Для начала из C# а не из XAML-шаблона.

Y>Я вообще все неправильно делаю?


Если картинка статичная, то ее не зачем держать в viewModel, в модели должно быть то, что изменяется. Копируем картинку в проект, в xaml пишем:

<Image Source="img.png"></Image>


Если есть решарпер, он сам предлагает выбрать uri в качестве источника, выбираем нужную картинку и все.
Программа – это мысли спрессованные в код
Re[4]: Забиндить на результат асихронной операции
От: ylem  
Дата: 04.09.16 17:18
Оценка:
Q>Если картинка статичная, то ее не зачем держать в viewModel,

ViewModel подставляет разные картинки в зависимости от состояния модели.
Самым естественным путем мне пока кажется в геттере сделать
return Properties.Resources.MyImage;

Ну и в этом месте хотелось бы обойтись без строковых литералов и констант.
Статические свойства в Properties.Resources кажутся очень удобными потому что их использование проверяется при компиляции.
Опять хочу неправильного?
Отредактировано 04.09.2016 17:19 ylem . Предыдущая версия .
Re[5]: Забиндить на результат асихронной операции
От: Qulac Россия  
Дата: 04.09.16 18:08
Оценка:
Здравствуйте, ylem, Вы писали:

Q>>Если картинка статичная, то ее не зачем держать в viewModel,


Y>ViewModel подставляет разные картинки в зависимости от состояния модели.

Y>Самым естественным путем мне пока кажется в геттере сделать
Y>
Y>return Properties.Resources.MyImage;
Y>

Y>Ну и в этом месте хотелось бы обойтись без строковых литералов и констант.
Y>Статические свойства в Properties.Resources кажутся очень удобными потому что их использование проверяется при компиляции.
Y>Опять хочу неправильного?

Можно и так, только bitmap нужно будет конвертировать в ImageSource: тут Предпоследний вариант рабочий.
Вообще стандартный прием в wpf для таких сценарием использовать разные шаблоны данных и для разных состояний модели.
Программа – это мысли спрессованные в код
Re[6]: Забиндить на результат асихронной операции
От: ylem  
Дата: 04.09.16 20:05
Оценка:
Q>Можно и так, только bitmap нужно будет конвертировать в ImageSource: тут Предпоследний вариант рабочий.

Ну вот примерно такие жуткие решения я и находил и не верил, что так и задумано (видимо все-таки не задумано и WPF и автогенеренные свойства в Properties.Resources по задумке авторов не совместимы).
Спасибо!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.