Здравствуйте, 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 автоматом в зависимости от типа будет подставляться нужный шаблон с контролами.
Здравствуйте, 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
Если шаблоны для разных состояний сильно отличаются то лучше использовать разные типы состояний и шаблоны привязывать к типу
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}" />
”Жить стало лучше... но противнее. Люди которые ставят точку после слова лучше становятся сторонниками Путина, наши же сторонники делают акцент на слове противнее ( ложь, воровство, лицемерие, вражда )." (с) Борис Немцов
WPF.
Хочется забиндить элементы UI в WPF на результаты асинхронной операции.
Типа, чтобы забиндил, UI не заблокировался, а когда операция выполнилась, значения в контролах появились.
В идеале хочется, чтобы операция возвращала сложную структуру (класс), и несколько контролов биндились на разные свойства этого класса.
Ко всему этому хочется простой способ отобразить в UI, что, типа еще считается (с анимацией если совсем просто, или без).
Есть какой-нибудь более или менее конвеншенал способ это делать?
Первое, что приходит в голову, это объект из ViewModel создать "сразу", а когда данные появятся пусть объект кидает PropertyChanged.
Еще нагуглил вот, но не уверен, на сколько это можно тащить в продашкен-код.
Q>Работает это все так: viewModel сразу возвращает пустой объект, затем после выполнения объект нужного класса, в label автоматом в зависимости от типа будет подставляться нужный шаблон с контролами.
Спасибо!
можно еще вопрос?
ViewModel одним из свойств должен "показывать" картинку. Было в планах просто возвращать System.Drawing.Image из ресурсов (Proeprties.Resources),
но вот как простым и лаконичным образом это свойство прибиндить к System.Windows.Controls.Image я так и не нашел. Для начала из C# а не из XAML-шаблона.
Здравствуйте, 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 в качестве источника, выбираем нужную картинку и все.
Q>Если картинка статичная, то ее не зачем держать в viewModel,
ViewModel подставляет разные картинки в зависимости от состояния модели.
Самым естественным путем мне пока кажется в геттере сделать
return Properties.Resources.MyImage;
Ну и в этом месте хотелось бы обойтись без строковых литералов и констант.
Статические свойства в Properties.Resources кажутся очень удобными потому что их использование проверяется при компиляции.
Опять хочу неправильного?
Здравствуйте, ylem, Вы писали:
Q>>Если картинка статичная, то ее не зачем держать в viewModel,
Y>ViewModel подставляет разные картинки в зависимости от состояния модели. Y>Самым естественным путем мне пока кажется в геттере сделать Y>
Y>return Properties.Resources.MyImage;
Y>
Y>Ну и в этом месте хотелось бы обойтись без строковых литералов и констант. Y>Статические свойства в Properties.Resources кажутся очень удобными потому что их использование проверяется при компиляции. Y>Опять хочу неправильного?
Можно и так, только bitmap нужно будет конвертировать в ImageSource: тут Предпоследний вариант рабочий.
Вообще стандартный прием в wpf для таких сценарием использовать разные шаблоны данных и для разных состояний модели.
Q>Можно и так, только bitmap нужно будет конвертировать в ImageSource: тут Предпоследний вариант рабочий.
Ну вот примерно такие жуткие решения я и находил и не верил, что так и задумано (видимо все-таки не задумано и WPF и автогенеренные свойства в Properties.Resources по задумке авторов не совместимы).
Спасибо!