#c# #wpf #validation #mvvm
#c# #wpf #проверка #mvvm
Вопрос:
У меня есть один пользовательский элемент управления со списком (UC1), и у меня есть другой пользовательский элемент управления с одним текстовым полем с двумя кнопками (UC2).
Я поместил один экземпляр UC2 в MainWindow. И мне также нужно поместить 5 экземпляров UC1 в MainWindow.
UC2 позволит пользователю просматривать текстовый (CSV) файл. После просмотра файла все имена столбцов будут заполнены в каждом выпадающем списке (с помощью класса Messenger от MVVMFoundation).
Затем я помещаю проверку в каждую модель представления со списком, чтобы пользователь не мог дважды выбирать одно и то же имя столбца. Я могу выполнить индивидуальную проверку с помощью IDataErrorInfo.
Например: когда ComboBox1 уже выбрал ColA, если ComboBox2 тоже выбирает ColA, ComboBox2 вызовет ошибку проверки и покажет красную цветную рамку с подсказкой.
Но когда я меняю ComboBox1 на ColB, ComboBox2 должен очистить от ошибки проверки (по обычной логике). Проблема в том, что я не знаю, как устранить ошибку ComboBox2 из модели представления ComboBox1.
Что я пробовал:
1. Я пытался отправлять сообщения во все зарегистрированные модели представления со списком каждый раз, когда один combobx получал проверку проверки (но он будет продолжать входить во вложенный цикл). Итак, я сдаюсь.
2. (понятия не имею, как я могу этого добиться).
Вот мой код для модели представления со списком.
public string this[string columnName]
{
get
{
string result = string.Empty;
switch (columnName)
{
case "SelectedObject": result = CheckData(); break;
}
return resu<
}
}
private string CheckData()
{
if (_menu == 1)
{
if (App.myExport1.chosenCols.ContainsValue(_selectedObject.ColIndex))
{
if (App.myExport1.chosenCols.ContainsKey(_colNo))
App.myExport1.chosenCols[_colNo] = _selectedObject.ColIndex;
else
App.myExport1.chosenCols.Add(_colNo, _selectedObject.ColIndex);
return "Column name already chosen!";
}
else
{
if (App.myExport1.chosenCols.ContainsKey(_colNo))
App.myExport1.chosenCols[_colNo] = _selectedObject.ColIndex;
else
App.myExport1.chosenCols.Add(_colNo, _selectedObject.ColIndex);
return null;
}
}
else if (_menu == 2)
return null;
else if (_menu == 3)
return null;
else if (_menu == 4)
return null;
else
return null;
}
Вот мой код ComboBox XAML.
<ComboBox Grid.Row="1" Grid.Column="1" Name="cboCol"
ItemsSource="{Binding Masters}" SelectedValuePath="{Binding ColIndex}"
SelectedItem="{Binding SelectedObject,ValidatesOnDataErrors=True}"
DisplayMemberPath="ColName" ToolTip="{Binding RelativeSource={RelativeSource self}, Path=(Validation.Errors).CurrentItem.ErrorContent}" />
Любое предложение / руководство о том, как я могу этого добиться?
Пожалуйста, не обращайте внимания на мой приведенный выше код, если он не соответствует правильному способу MVVM, хотя я сказал, что использую подход MVVM (я только начинаю пытаться использовать подход MVVM и все еще не знаком с ним).
Обновить
После получения обратной связи от «Jai» я понимаю и замечаю свой неправильный способ использования единого элемента управления в user control. Простите за мой начинающий способ ведения дел. будет считать, что дело закрыто.
Комментарии:
1. 1. Вероятно, вы разделяетесь на слишком много подвидов и viewmodels. 2. Я не знаком с MVVMFoundation, но по логике вещей, у вас должно быть где-то свойство, которое содержит все использованные значения, и выполняет проверку проверки по единственной ObservableCollection.
2. @Jai, да, моим последним решением будет это. У меня есть все мои значения в классе модели App.myExport1. Я могу выполнить проверку проверки на нем из MainViewModel и уведомить каждое представление о появлении ошибки (путем отображения / скрытия эффекта выпадающей тени) Но я не уверен, что это нарушит работу MVVM. Итак, я приостановил эту проверку.
3. Вы должны знать, что у вас слишком много вложенных представлений / вложенных моделей, когда у вас есть представление с одним компонентом пользовательского интерфейса с одним свойством в viewmodel для привязки. Я бы подумал, что логично сгруппировать все списки со списком в один view / viewmodel. Таким образом, они могут делиться многими вещами, и вам не понадобится messenger для каждой отдельной вещи.
4. @Jai, спасибо за ваше предложение. Однако, если мне нужно сгруппировать их в один пользовательский элемент управления, не помешает ли это цели «повторного использования»? Потому что, как вы можете видеть из моей приведенной выше проверки. У меня другая опция «Меню». каждое меню будет представлять различный выбор столбцов, поэтому я не могу указать фиксированный номер выпадающего списка в одном пользовательском элементе управления. итак, я решил создать единый пользовательский элемент управления со списком. (Пожалуйста, поправьте меня, если моя логика неверна).
5. Вы уже повторно используете компонент под названием «ComboBox». Вы уже не создаете этот элемент управления с нуля, не так ли? 🙂