У меня есть приложение WPF, которое предназначено для асинхронного получения информации из базы данных, и, когда она, наконец, получит ее, отобразит ее в различных текстовых полях.
У меня асинхронный поиск работает нормально, но я 'Я новичок в WPF и MVVM.Раньше у меня не было должного разделения моего пользовательского интерфейса и модели, и поэтому было легко указать текстовым полям отображать «Запрос ...», пока фактические данные не были доступны.
Теперь, хотя япопытался отделить модель от пользовательского интерфейса, и я больше не уверен, куда это поставить.
Допустимо ли (с точки зрения MVVM), чтобы кнопка пользовательского интерфейса обновляла различные текстовые поля пользовательского интерфейса, говоря «Запрос... "внутри своего собственного события click (наряду с вызовом метода ViewModel, который в конечном итоге обновит свойства, с которыми связаны эти текстовые поля, которые затем должны заменить их фактическими данными)?
Если нет, где -should-эта логика пошла.(Я также знаю, что команды лучше, чем события onClick, но, пожалуйста, по одной за раз :))
Вот что я сейчас думаю:
class MainWindow
{
private ViewModel _viewModel;
doStuffButton_Click(object sender, RoutedEventArgs e)
{
textBox1.Text = "Querying..."
textBox2.Text = "Querying..."
// ... and so on in a foreach looop probably.
_viewModel.asyncGoAndLookupStuff(); // starts a Task that
// updates properties that the textBoxes are bound to
// and fires the appropriate PropertyChanged events.
}
}
Это хорошая практика?Если нет, как я должен получить такую функциональность в ViewModel?У меня была попытка, и я столкнулся с серьезными проблемами, устанавливая свойства ViewModel для различных строк, в то же время все еще будучи в состоянии установить для них соответствующие (не строковые) значения из Модели при их обновлении.Может ли это быть решено с помощью ValueConverter (и нулевых значений)?Я действительно понятия не имею, как это сделать, но я пока мало смотрел на конвертеры.
Я видел много вещей о том, как пользовательский интерфейс не должен ничего знать о том, что на самом делечто происходит в ViewModel, и как он должен просто тупо сидеть и отображать то, что ViewModel выставил в данный момент, но причина, по которой я задаю этот вопрос, заключается в том, что я не уверен, насколько осторожна слишком большая.
РЕДАКТИРОВАТЬ:
Я не думал, что это будет уместно, но из ответов ниже это может быть.Внизу в модели у меня есть что-то похожее (немного больше / сложнее)
class DataItem
{
// assume a ctor to set it up here.
public int SmallNumber { get; private set; }
public int BigNumber { get; private set;}
}
class Model
{
public DataItem Foo;
public DataItem Bar;
}
, и текстовые поля (в настоящее время) все связаны с такими вещами, как ViewModel.Model.Foo.SmallNumber или ViewModel.Model.Bar.BigNumber.
Действительно ли мне нужно создавать отдельные свойства в ViewModel для каждого подэлемента модели (например, ViewModel.FooSmallNumber как строковое свойство), чтобы они могли всебыть типами строк?Я хотел бы сохранить эту относительно прямую привязку непосредственно к модели, если это возможно, но все же иногда текстовые поля отображают полезные строки.(В настоящее время я не могу полагаться на то, что свойства Модели являются нулевыми, когда они запрашивают, они могут содержать устаревшую информацию ... Я мог бы изменить ее, чтобы очистить их, я думаю.)